Python 3 打印生成器
我在使用print()函数(Python 3)时遇到了一个问题。
当我想要计算一个数列的总和时,我可能会用以下的代码模式:
>>> sum(i for i in range(101))
但是当我想检查我创建的数列时:(我选择使用print(),并假设它会一行一行地打印出来)
>>> print(i for i in range(101))
结果却变成了一个生成器对象,没有返回任何值。所以我必须使用list()来检查这个数列。这是print函数的缺陷吗?
附注:上面的代码是用来形成一个生成器的例子,并不是自然数列的最简单形式,而是复杂数列的基本结构。为了方便检查数列的值,我在寻找一种方法,可以一行一行地打印出每个值。
2 个回答
1
这种行为和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>
一般来说,如果你想真正了解这些项目,使用列表可能是最简单的(只需要加上几个方括号就可以了):
print [i*i for i in range(30)]
或者在python3.x中:
print([i*i for i in range(30)])
14
sum
是用来把一堆东西加起来的,而 print
是用来打印单独的内容。如果你想把生成器里的所有项目分别传给 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')