所以我试图推出一个我在网站上第一次听到的技巧。
[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的脑海中两者之间有什么不同,因为我无法分辨它是什么 - 两个函数都返回“无”,对吧?
答案 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)