Skip to main content
 首页 » 编程设计

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

2025年05月04日22fff_TT

我有以下生成器:

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. 中
  4. 生成器的工作方式类似于 (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)。