我有以下生成器:
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'
但是,我不明白它是如何运作的。
从目前为止我发现:
_
在Python的语法中没有特殊含义_
不在chars
list
(expression(x) for x in iterator)
我试图以交互模式进一步分解代码,这就是我发现的:
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)
没有明显的连接时,它们如何与它们进行通信?
答案 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)
只是一个将列表元素连接成字符串的字符串方法。