我有以下生成器:

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)进行通信?

最佳答案

您只是多次拨打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收集他们实际感兴趣的值。

关于python - ''.join(random.choice(chars)for _ in range(size)),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47142467/

10-11 23:10
查看更多