假设我有这个列表和以下将列表格式化为易于阅读的格式的代码:
a = ['erin', 'david', 'chris', 'adam']
print('\n'.join('{}: {}'.format(i,j) for i,j in reversed(list(enumerate(a,1)))))
输出是这样的:
4: adam
3: chris
2: david
1: erin
如果我将上面的代码转换为 for 循环,我发现为了获得与上面相同的结果,您必须删除 .join() 方法。
for 循环看起来像这样:
for i, j in reversed(list(enumerate(a,1))):
print ('{}: {}'.format(i,j))
输出:
4: adam
3: chris
2: david
1: erin
对我来说,for 循环更有意义,我只是不明白为什么在列表理解中,我需要 join() 方法来获得相同的结果。
请您参考如下方法:
从技术上讲,您使用的是生成器表达式,而不是列表理解。
真正重要的问题(在我看来)是为什么首先需要 join,原因是 print 不会迭代可迭代对象作为参数传递,它只是调用 __str__ 方法来获取对象的字符串表示形式,并打印出来。对于 list,__str__ 方法生成显示其元素的列表表示,因此看起来好像 print 遍历了列表,当它实际上没有。
如果您显式写出生成器表达式:
>>> g = ('{}: {}'.format(i,j) for i,j in reversed(list(enumerate(a,1))))
然后尝试打印它,您将只看到有关该对象的信息:
>>> print(g)
<generator object <genexpr> at 0x10fb929e8>
如果你遍历它,你会为列表中的每个元素得到一个字符串 a:
>>> next(g)
'4: adam'
>>> next(g)
'3: chris'
>>> next(g)
'2: david'
>>> next(g)
'1: erin'
'\n'.join 字符串方法确实遍历您传递给它的参数,并将每个结果连接成一个字符串:
>>> g = ('{}: {}'.format(i,j) for i,j in reversed(list(enumerate(a,1))))
>>> '\n'.join(g)
'4: adam\n3: chris\n2: david\n1: erin'
当您使用 for 循环时,您还会迭代生成器表达式的结果,并打印每个结果。
