Python3打印生成器
在处理print()函数(Python 3)时出现了一个问题 当我寻找一系列的总和时,我可以使用以下代码模式:Python3打印生成器,python,python-3.x,printing,generator,Python,Python 3.x,Printing,Generator,在处理print()函数(Python 3)时出现了一个问题 当我寻找一系列的总和时,我可以使用以下代码模式: >>> sum(i for i in range(101)) 但当我检查我制作的系列时:(我选择print()并假设它将逐行打印出来) 它变成了一个没有返回值的生成器对象。所以我必须使用list()进行序列检查。这是打印功能中的一个缺陷吗 PS:上面写的是一个生成函数的例子,不是自然级数的最简单形式,而是复杂级数的骨骼结构。为了方便系列值检查,我正在寻找一种方法,逐
>>> sum(i for i in range(101))
但当我检查我制作的系列时:(我选择print()并假设它将逐行打印出来)
它变成了一个没有返回值的生成器对象。所以我必须使用list()进行序列检查。这是打印功能中的一个缺陷吗
PS:上面写的是一个生成函数的例子,不是自然级数的最简单形式,而是复杂级数的骨骼结构。为了方便系列值检查,我正在寻找一种方法,逐行打印每个值
sum
需要将一系列内容相加,而print
需要单独的参数来打印。如果要将所有生成器项目分别馈送到打印
,请使用*
符号:
print(*(i for i in range(1, 101)))
在这两种情况下,您实际上都不需要发电机,不过:
sum(range(1, 101))
print(*range(1, 101))
如果要将它们放在单独的行中,则需要对print
进行多个单独调用,这意味着您需要常规循环的行为:
for item in generator_or_range_or_whatever:
print(item)
尽管您也可以选择将'\n'
指定为项目分隔符:
print(*generator_or_range_or_whatever, sep='\n')
此行为与python2.x上的行为没有太大区别:
Python 2.7.5 (default, Mar 9 2014, 22:15:05)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> print (i*i for i in range(30))
<generator object <genexpr> at 0x10c034a50>
或者在python3.x上:
print([i*i for i in range(30)])
这很有趣,因为据我所知,python2.x的print语句没有类似的行为+来自我的1。@mgilson:嗯,总是有来自未来导入打印函数的
,但是对于语句版本,没有类似的。是的,我确实想到了。。。我的观点是,这是一个有趣的打印函数用例,你不能用打印语句得到它。这是自然数序列,我倾向于用它在一定范围内执行更复杂的序列,如xx-1,因此我必须验证序列中的值。不过,感谢您的简化。如果您希望逐行打印它们,您也可以立即打印它们,并将sep
关键字参数设置为'\n'
。我是否可以观察到[I for I in range(30)]
是range(30)
,如果x>3==True,编写它与编写类似:
。因此,您可以编写print range(30)
和print(range(30))
@holdenwebprint([range(20)])
也返回生成器对象的列表。因此,唯一的解决方案是在..
@holdenweb中为i扩展并写入,这也是2.x和3.x之间的区别。2.x的范围是一个创建列表的函数;3.x的range
是一个类似于2.xxrange
的类,但有一点额外的功能。正确。从生成器生成列表的最简单方法是应用内置的list()。将其应用到列表中会承担创建重复列表的成本,但这并不比在不必要的理解中对其进行迭代更糟糕。当然,风格各不相同…@mgilson感谢您的回复,不必为迭代问题操心,因为我打算以任何方式展示生成器案例(因为“简单优于复杂”是Python的禅),我宁愿给出一个简单的示例,而不是“复杂到适合最简单”的示例。
print [i*i for i in range(30)]
print([i*i for i in range(30)])