Python 3 打印生成器

8 投票
2 回答
5458 浏览
提问于 2025-04-18 15:36

我在使用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')

撰写回答