我有以下生成器:
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语法中没有特殊意义_不在charslist 中
- 生成器的工作方式类似于
(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) 通信,当它们没有彼此有明显联系?
请您参考如下方法:
您只是多次调用 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 来收集他们真正感兴趣的值(value)。
