在python列表理解中调用print

时间:2013-05-01 14:47:51

标签: python python-2.7 list-comprehension

所以我试图推出一个我在网站上第一次听到的技巧。

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

这个想法是你可以在listcomp的每一步调用一个任意函数,方法是将它放在一个总是返回True的“if”语句中。但是该代码会产生语法错误。

如果我包装我想要这样调用的函数,但是:

def f(i):
    print i

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

它产生所需的输出。所以我想知道在Python的脑海中两者之间有什么不同,因为我无法分辨它是什么 - 两个函数都返回“无”,对吧?

3 个答案:

答案 0 :(得分:6)

您不能将语句(如Python 2中的print)与列表推导混合使用。

但是,可以通过添加

使print()成为一个函数
from __future__ import print_function

位于文件顶部。这会将print()转换为整个模块的函数。

但是,您使用语句True or something并且永远不会评估'某事',因为Python布尔表达式会短路。你想转过来:

if print(something) or True

如果左侧已评估为or,则评估True表达式的右侧没有意义;没有任何右侧可以提出的任何内容都会使整个表达False永远。

你真的想在列表理解中避免这样的副作用。使用正确的循环并将这些惊喜从代码中删除,使用if something or True实际上是一种混乱,会使代码的未来维护者(包括您)感到困惑。

答案 1 :(得分:5)

在Python 2.x中,print不是一个函数。它成为Python 3中的一个函数。

答案 2 :(得分:1)

print是py2x中没有表达式的语句,因此不能在需要表达式的地方使用它。

您需要从print_function导入__future__才能使其正常运行。

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)