尝试了解python中的以下生成器

时间:2018-09-03 03:38:47

标签: python-3.x generator

我试图了解以下两个代码段之间的区别。第二个只是打印生成器,而第一个片段将其扩展并迭代生成器。为什么会发生? 是否因为两个方括号扩展了任何可迭代的对象?


#Code snippet 1


li=[[1,2,3],[4,5,6],[7,8,9]] 
for col in range(0,3):
    print( [row[col] for row in li] )`
Output: 
[1, 4, 7]
[2, 5, 8]
[3, 6, 9]

#Code snippet 2


li=[[1,2,3],[4,5,6],[7,8,9]]
for col in range(0,3):
    print( row[col] for row in li )
  

输出

<generator object <genexpr> at 0x7f1e0aef55c8>
<generator object <genexpr> at 0x7f1e0aef55c8>
<generator object <genexpr> at 0x7f1e0aef55c8>

为什么上面两个引号的输出不同?

1 个答案:

答案 0 :(得分:1)

print函数在其参数中输出对象的__str__方法的返回值。对于列表,__str__方法返回格式良好的字符串,以逗号分隔的项目值括在方括号中,但是对于生成器对象,__str__方法仅返回通用对象信息,从而避免更改状态。发电机。

通过将生成器表达式放在方括号中,您可以使用列表推导通过迭代生成器表达式的输出来显式地创建列表。由于这些项目已经产生,因此列表的__str__方法将毫无问题地返回其值。