Python3打印生成器

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:上面写的是一个生成函数的例子,不是自然级数的最简单形式,而是复杂级数的骨骼结构。为了方便系列值检查,我正在寻找一种方法,逐

在处理print()函数(Python 3)时出现了一个问题

当我寻找一系列的总和时,我可以使用以下代码模式:

>>> 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))
@holdenweb
print([range(20)])
也返回生成器对象的列表。因此,唯一的解决方案是在..
@holdenweb中为i扩展并写入
,这也是2.x和3.x之间的区别。2.x的
范围
是一个创建列表的函数;3.x的
range
是一个类似于2.x
xrange
的类,但有一点额外的功能。正确。从生成器生成列表的最简单方法是应用内置的
list()。将其应用到列表中会承担创建重复列表的成本,但这并不比在不必要的理解中对其进行迭代更糟糕。当然,风格各不相同…@mgilson感谢您的回复,不必为迭代问题操心,因为我打算以任何方式展示生成器案例(因为“简单优于复杂”是Python的禅),我宁愿给出一个简单的示例,而不是“复杂到适合最简单”的示例。
print [i*i for i in range(30)]
print([i*i for i in range(30)])