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循环在这种情况下是如何工作的.
它可能有助于"展开"生成器表达式中的循环,并将它们写为独立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循环的执行情况.首先,外环套i到0和code到'F',和内,内环套fn来int,然后str等你拿
int(0+1, 'F')
str(0+1, 'F')
Run Code Online (Sandbox Code Playgroud)
之后它继续下一个i和code.
在您的示例中,您正在使用以下文字表示的元组序列(此处由生成器表达式提供)构建字典
\n\n(fn(i+1), code)\nRun Code Online (Sandbox Code Playgroud)\n\n在此元组文字中,所有术语(除了1:) 均由两个循环提供;外循环
\xe2\x80\xa6 for i, code in enumerate('TROIDSNB') \xe2\x80\xa6\nRun Code Online (Sandbox Code Playgroud)\n\n为您提供i,一个整数值和code,一个 1 个字符长的字符串 \xe2\x80\x94 这些值在执行内部循环时是固定的;
\n内循环为您提供的值fn
\xe2\x80\xa6 for fn in (int, str) \xe2\x80\xa6\nRun Code Online (Sandbox Code Playgroud)\n\n可以采用 2 个值,或者fn=int或fn=str。
当构造第一个元组时,i=0,code='T'和fn=int
(int(0+1), 'T')\nRun Code Online (Sandbox Code Playgroud)\n\n当构造第二个元组时,i和code(由外循环提供)没有改变fn=str,但是 ,因此传递给字典构造函数的新元组是
(str(0+1), 'T')\nRun Code Online (Sandbox Code Playgroud)\n\n此时内循环已到达结束\xe2\x80\xa6,外循环更新其变量的值,i=1并且code=R,内循环被重置,因此fn=int生成了一个新的元组
(int(1+1), 'R')\nRun Code Online (Sandbox Code Playgroud)\n\n等等等等
\n| 归档时间: |
|
| 查看次数: |
1215 次 |
| 最近记录: |