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
    ,然后再次查看生成器表达式。它通常仅用于在需要赋值时表示“我们实际上不使用此值”。