字典生成器中有多个'for'循环

Sea*_*ean 13 python generator python-3.x

此Python文档中,以下内容用作生成器表达式的示例:

dict((fn(i+1), code)
    for i, code in enumerate('FGHJKMNQUVXZ')
    for fn in (int, str))

>> {1: 'F', '1': 'F', 2: 'G', '2': 'G', 3: 'H', '3': 'H', 4: 'J',...}
Run Code Online (Sandbox Code Playgroud)

我不明白第二个for循环如何for fn in (int, str)将int值转换为字符串并向字典添加一个额外的条目.

我找到了这个Stack Overflow问题,但是我仍然无法知道第二个for循环在这种情况下是如何工作的.

Dav*_*d Z 8

它可能有助于"展开"生成器表达式中的循环,并将它们写为独立for循环.为此,您将所有for (variable) in (iterable)语句放在单独的行中,按相同的顺序排列,但将事物从前面移动到最内层的for循环体.像这样,一般来说:

thing for a in a_list for b in b_list for c in c_list
Run Code Online (Sandbox Code Playgroud)

for a in a_list:
    for b in b_list:
        for c in c_list:
            thing
Run Code Online (Sandbox Code Playgroud)

除了当你执行生成器表达式时,所有things都自动进入列表或字典或其他任何内容.在你的情况下,

dict((fn(i+1), code)
    for i, code in enumerate('FGHJKMNQUVXZ')
    for fn in (int, str))
Run Code Online (Sandbox Code Playgroud)

for i, code in enumerate('FGHJKMNQUVXZ'):
    for fn in (int, str):
        (fn(i+1), code)
Run Code Online (Sandbox Code Playgroud)

除了将所有元组转换为a dict.

正如其他答案所解释的那样,您可以跟踪这两个for循环的执行情况.首先,外环套i0code'F',和内,内环套fnint,然后str等你拿

int(0+1, 'F')
str(0+1, 'F')
Run Code Online (Sandbox Code Playgroud)

之后它继续下一个icode.


gbo*_*ffi 1

在您的示例中,您正在使用以下文字表示的元组序列(此处由生成器表达式提供)构建字典

\n\n
(fn(i+1), code)\n
Run Code Online (Sandbox Code Playgroud)\n\n

在此元组文字中,所有术语(除了1:) 均由两个循环提供;外循环

\n\n
\xe2\x80\xa6 for i, code in enumerate('TROIDSNB') \xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n\n

为您提供i,一个整数值和code,一个 1 个字符长的字符串 \xe2\x80\x94 这些值在执行内部循环时是固定的;
\n内循环为您提供的值fn

\n\n
\xe2\x80\xa6 for fn in (int, str) \xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n\n

可以采用 2 个值,或者fn=intfn=str

\n\n

当构造第一个元组时,i=0,code='T'fn=int

\n\n
(int(0+1), 'T')\n
Run Code Online (Sandbox Code Playgroud)\n\n

当构造第二个元组时,icode(由循环提供)没有改变fn=str,但是 ,因此传递给字典构造函数的新元组是

\n\n
(str(0+1), 'T')\n
Run Code Online (Sandbox Code Playgroud)\n\n

此时内循环已到达结束\xe2\x80\xa6,外循环更新其变量的值,i=1并且code=R,内循环被重置,因此fn=int生成了一个新的元组

\n\n
(int(1+1), 'R')\n
Run Code Online (Sandbox Code Playgroud)\n\n

等等等等

\n