Python '';。联接(随机选择(字符)(范围(大小))
我有以下发电机:Python '';。联接(随机选择(字符)(范围(大小)),python,generator,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() O
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'
for i in range(3):
print("Spam, ham, and eggs.")
Spam, ham, and eggs.
Spam, ham, and eggs.
Spam, ham, and eggs.
然而,我不明白它是如何工作的
根据我目前的发现:
在Python语法中没有特殊意义
\uu
不在字符中
列表中
(迭代器中x的表达式(x)
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']
[38]中的:chars=string.ascii\u小写+string.digits
In[39]:大小=10
在[40]中:(随机选择范围(大小)中的字符)
出[40]:
In[41]:列表(uu范围内(大小)的随机选择(字符))
...: )
Out[41]:[6',v',3',d',m',c',h',1',v',n']
所以我的问题是,当生成器的
random.choice(chars)
部分与范围内(size)的迭代部分之间没有明显的联系时,它们如何进行通信?您只是多次调用random.choice(chars)
size
。\uuu
只是用作语法循环控制变量,但它所持有的int
值没有任何作用。它类似于如下所示的循环:
In [30]: random_string_generator()
Out[30]: '6v0vhljxac'
for i in range(3):
print("Spam, ham, and eggs.")
Spam, ham, and eggs.
Spam, ham, and eggs.
Spam, ham, and eggs.
其中打印以下内容:
In [30]: random_string_generator()
Out[30]: '6v0vhljxac'
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()
函数返回三个值:名字、中间名和姓氏。但是,程序员可能假设只对示例函数的第三个返回值感兴趣,因此他们可能使用
捕获前两个返回值,并使用姓氏
收集他们实际感兴趣的值。您只是调用random.choice(chars)
大小
多次。\uuu
只是用作语法循环控制变量,但它所持有的int
值没有任何作用。它类似于如下所示的循环:
In [30]: random_string_generator()
Out[30]: '6v0vhljxac'
for i in range(3):
print("Spam, ham, and eggs.")
Spam, ham, and eggs.
Spam, ham, and eggs.
Spam, ham, and eggs.
其中打印以下内容:
In [30]: random_string_generator()
Out[30]: '6v0vhljxac'
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()
函数返回三个值:名字、中间名和姓氏。然而,程序员可能假设只对示例函数的第三个返回值感兴趣,因此他们可能使用
捕获前两个返回值,并使用姓氏
收集他们实际感兴趣的值。[a表示范围内(10)]
将产生[1,2,3,4,5,6,7,8,9]
这样这个语法就产生了列表
[1代表范围(2)]
将产生[1,1]
,因此1
将在行中添加两次
[范围(10)内的随机变量]
将产生10个随机变量
str.join(list)
只是一种将列表元素连接到字符串中的字符串方法。[a表示范围(10)]
将生成[1,2,3,4,5,6,7,8,9]
,因此该语法生成列表
[1代表范围(2)]
将产生[1,1]
,因此1
将在行中添加两次
[范围(10)内的随机变量]
将产生10个随机变量
str.join(列表)
只是一种将列表元素连接到字符串中的字符串方法。基本上,你是在做随机。选择大小
次。因为你不关心你在任何时候都在进行哪个迭代,所以你不需要在变量中跟踪该值。\uu
是表示您正在“转储”\uu
与任何其他变量一样。请将其替换为x
,然后再次查看生成器表达式。它通常仅用于表示“我们实际上不使用此值”当你需要赋值时。基本上,你在做随机。选择
大小
次。因为你不关心你在任何时候进行的迭代,所以你不需要在变量中跟踪该值。\uuu
是表示你正在“转储”的值的传统方式\uu
与任何其他变量一样。将其替换为x
,然后再次查看生成器表达式。它通常仅用于在需要赋值时表示“我们实际上不使用此值”。