2013-05-01 104 views
3

所以我想拉过一招其实我第一次听说这个网站的中间调用打印。在Python列表理解

[i for i in range(0, 10) if True or print(i)] 

的想法是,你可以坚持到底的“如果”语句,将始终返回true内部在listcomp的每一步调用任意函数。但是,该代码给出了语法错误。

如果我换我想这样调用的函数,虽然:

def f(i): 
    print i 

[i for i in range(0, 10) if True or f(i)] 

它产生所需的输出。所以我想知道在Python的思想中,两者之间有什么区别,因为我不知道它可能是什么 - 两个函数都返回“无”,对吧?

+2

'从__future__进口print_function';但为什么你需要有副作用呢? – 2013-05-01 14:51:06

+2

如果您实际上不需要它生成的列表,请不要使用列表解析来代替for-loop。 – chepner 2013-05-01 14:55:37

回答

6

你不能(在Python 2类似print)与列表理解混合语句。在你的文件的顶部

from __future__ import print_function 

但是,您可以使一个print()功能加入。这将print()变成整个模块的功能。

但是,你正在使用的语句True or something和永远不会评估“东西”因为Python布尔表达式的短路。要围绕转:

if print(something) or True 

有评价,如果左侧已经评价True一个or表达的右侧没有任何意义;右边的任何东西都不会让整个表达式成为False

你真的想要避免这样的副作用,但在列表理解。使用适当的循环,并保持代码不会出现这样的惊喜,使用if something or True实际上是一种黑客,它会混淆未来的代码维护人员(包括您)。

+0

啊,有道理。我不知道print()不是函数。关于短路的事情你是对的:我提供的代码实际上并没有产生正确的输出 - 我想的是“不是f(i)”。 – 2013-05-01 15:05:32

5

在Python 2.x中,打印是不是一个函数。它成为一个功能在Python 3

1

print是py2x声明中没有表达,因此不能用在表达式的预期。

您需要以使其工作从__future__导入print_function

In [105]: from __future__ import print_function 

In [107]: [i for i in range(0, 10) if print(i) or True] 
0 
1 
2 
3 
4 
5 
6 
7 
8 
9 
Out[107]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

注意,作为print()回报None所以在您or条件是必须放在第一或使用and条件:if True and not print(i)

+0

这是列表理解的返回值; 'print()'*不叫*。 – 2013-05-01 14:55:09

+0

'真和印(i)'不会做你想要的;它会评估为“False”,而不会在结果列表中添加任何内容。 – 2013-05-01 15:00:08

+0

@MartijnPieters啊!是的,忘了在它之前加一个'not'。 – 2013-05-01 15:01:35