不知道是否曾经问过这个问题,但是我找不到正确,清晰的解释。
我担心与python语法相关的事情。
在练习一些python时,我凭直觉地认为这将打印列表中的所有元素。清单1。
但是它似乎没有这样做,为什么会这样呢?
我显然可以用许多其他方式打印它;但是我无法理解这里固有的python逻辑。
list1 = [1,2,3,4]
print(list1[i] for i in range(len(list1)))
我希望输出为'[1、2、3、4],但它会打印一个生成器对象。
答案 0 :(得分:4)
您需要在list1[i] for i in range(len(list))
周围加上[]
,以表明这是一个列表。尽管list1
是一个列表,但是您尝试使用生成器表达式将其打印出来,这将返回一个生成器对象(类似于列表的可迭代类型。)而未指定您想要将生成器转换为列表,它不会打印列表。 (将生成器表达式转换为列表称为列表理解。)
即使您这样做,它仍然会打印[1, 2, 3, 4]
而不是1 2 3 4
。您需要执行[print(list1[i], end=" ") for i in range(len(list1)))]
才能正常工作。有更好的方法:请参阅donkopotamus的答案。
答案 1 :(得分:2)
表达式(list1[i] for i in range(len(list)))
定义了一个生成器对象。这就是打印出来的内容。
如果您希望打印列表,则将其设为列表理解而不是生成器,然后打印:
print( [list1[i] for i in range(len(list1))] )
或者,您可以通过使用例如
将生成器传递到适当的类型,从而将生成器的评估强制为tuple
(或list
或set
)。
print(tuple(list1[i] for i in range(len(list1))))
为了获得您期望的1 2 3 4
的特定输出(以空格分隔),可以通过以下方式使用str.join
:
>>> list1 = [1, 2, 3, 4]
>>> print(" ".join(list1[i] for i in range(len(list1))))
1 2 3 4
或将列表解压缩到print
中(这在python 2中不起作用,因为在python 2 print
中不是函数)
>>> print(*(list1[i] for i in range(len(list1))))
1 2 3 4
答案 2 :(得分:2)
(list1[i] for i in range(len(list1)))
确实是一个生成器对象,等效于
(x for x in list1)
您要将生成器作为单个参数传递给print
,因此print
只是打印它:它不会从中提取元素。
或者,您也可以在将其传递到print
时将其打开包装:
print(*(list1[i] for i in range(len(list1))))
这会将生成的序列的每个元素作为单独的参数传递给print
,因此应该分别打印它们。
如果您只是想打印列表,则可以使用以下任何一种方法:
print(list1)
print([list1[i] for i in range(len(list1))])
print([x for x in list1])
使用方括号可进行列表理解,而不是生成器表达式。
答案 3 :(得分:0)
在python中有一些叫做列表理解和生成器表达式的东西。它们是很棒的工具,您可以通过谷歌搜索找到更多信息。 Here是一个链接。
基本上,您可以在python中即时列出一个列表。
list1 = [1,2,3,4]
squared_list = [i*i for i in list1]
将返回所有项目均平方的列表。但是,我们说
squared_gen_list = (i*i for i in list1)
这将返回所谓的生成器对象。正如您从语法中看到的那样,这就是您所遇到的情况,因此您只是将其打印出来。希望能消除混乱。