2017-06-18 91 views
-2
N = [1, 2, 3] 
print(n for n in N) 

结果:如何打印发生器的内容?

<generator object <genexpr> at 0x000000000108E780> 

为什么此代码不能打印:

1 
2 
3 

然而代码:

sum(n for n in N) 

可以在N.

总结了所有的数

Co你可以告诉我为什么sum()可以工作,但是print()表达式?

+3

您正在创建一个生成器对象并正在打印该对象的表示形式。所以这个输出实际上是预期的。你究竟想达到什么目的? – idjaw

+0

'print'函数接受多个参数,并将每个参数与'sep'关键字参数指定的字符串分开。你可以使用'print(*(n代表n中的n),sep ='\ n')'产生期望的输出(或者更简单地说,print(* N,sep ='\ n')')。 – chepner

+0

不要将生成器*参数*与N'中的n(当然不是Python有效)中类Perl结构'print(n)混淆。 – chepner

回答

3

这是因为你传递了一个生成器来运行,这就是这个生成器返回的方法。如果你想打印什么会产生,你可以使用:

print(*N, sep='\n') # * will unpack list 

print(*(n for n in N), sep='\n') # Again, unpacks values 

print('\n'.join(map(str, n for n in N))) 

,或者如果你喜欢comprahensions:

[print(n) for n in N] 

你必须意识到最后一个方法的构造cts名单充满了None

+0

'[print(n)for n in N]'返回所有None的列表,但这可能是意想不到的 –

+0

Thanks @ cricket_007。编辑。 – Szymon

1

你是从字面上打印生成对象表示

如果你想在同一行,尝试打印列表

print([n for n in N]) 

这只是print(N)

如果你想分开串线,打印

print("\n".join(map(str, N))) 

或wri TE定期循环,并没有微优化的代码