''.join(random.choice(chars)for _ in range(size))

时间:2017-11-06 17:24:53

标签: python generator

我有以下生成器:

import random
import string

def random_string_generator(size = 10, chars = string.ascii_lowercase + string.digits):

    return "".join(random.choice(chars) for _ in range(size))

当我使用交互模式检查生成器时,我得到以下内容:

In [30]: random_string_generator()
Out[30]: '6v0vhljxac'

但是,我不明白它是如何运作的。

从目前为止我发现:

  1. _在Python的语法中没有特殊含义
  2. _不在chars list
  3. 生成器的工作方式与(expression(x) for x in iterator)
  4. 类似

    我试图以交互模式进一步分解代码,这就是我发现的:

    In [38]: chars=string.ascii_lowercase + string.digits
    
    In [39]: size=10
    
    In [40]: (random.choice(chars) for _ in range(size))
    Out[40]: <generator object <genexpr> at 0x10bc6b258>
    
    In [41]: list( (random.choice(chars) for _ in range(size))
        ...: )
    Out[41]: ['6', 'v', '3', 'd', 'm', 'c', 'h', '1', 'v', 'n']
    

    所以我的问题是当生成器的random.choice(chars)部分与迭代部分for _ in range(size)没有明显的连接时,它们如何与它们进行通信?

2 个答案:

答案 0 :(得分:4)

您只是多次致电random.choice(chars) size_仅用作语法循环控制变量,但它所拥有的int值没有任何用处。它类似于以下循环:

for i in range(3):

    print("Spam, ham, and eggs.")

打印以下内容:

Spam, ham, and eggs.
Spam, ham, and eggs.
Spam, ham, and eggs.

在这个例子中,循环体从不实现i,但是当循环遍历range(3)时它仍然执行三次。

传统上,当我们不关心特定变量所持有的值时,下划线通常用作变量名,例如循环控制变量或具有多个返回值的函数返回的一个或多个值。作为后者的一个例子:

def split_name(name):

    first_name, middle_name, last_name = name.split()

    return first_name, middle_name, last_name

_, _, surname = split_name("John R. Doe")

print(surname)

在这种情况下,split_name()函数返回三个值:名字,中间名和姓氏。但是,程序员可能假设只对示例函数的第三个返回值感兴趣,因此他们可能会使用_来捕获前两个返回值,并使用surname来收集他们实际感兴趣的值英寸

答案 1 :(得分:1)

[a for a in range(10)]将生成[1, 2, 3, 4, 5, 6, 7, 8, 9],以便此语法生成列表。

[1 for _ in range(2)]将生成[1, 1],以便在行中添加1 2次。

[random for _ in range(10)]将产生10个随机变量。

str.join(list)只是一个将列表元素连接成字符串的字符串方法。