问题描述
我刚刚开始学习 Python。我在 here 中看到了一段有趣的代码,作者用它来解释短路。代码如下:
>>> def fun(i):
... print "executed"
... return i
...
>>> fun(1)
executed
1
然后我尝试了 [fun(i) for i in [0,1,2,3]]
,输出如下所示:
>>> [fun(i) for i in [0,3]]
executed
executed
executed
executed
[0,3]
我期待这样的事情:
executed
0
executed
1
executed
2
executed
3
谁能告诉我我做错了什么?谢谢!
解决方法
>>> def fun(i):
... print "executed"
... return i
...
这不是短路的例子。这是有副作用的函数 - 它确实写入标准输出,除了返回值之外,这是可观察到的效果。
[fun(i) for i in [0,1,2,3]]
这是list
理解。一般来说,你应该有充分的理由在这种地方使用有副作用的函数,PEP 202 解释了 list
理解的动机如下:
列表推导式提供了一种更简洁的方式来创建列表
map()
和 filter()
和/或嵌套循环的情况
目前正在使用。
因此,阅读您的代码的人可能会认为它必须只是创建列表,而在此操作期间无需打印元素。
,在这种情况下,方形刹车形成一个新列表,其中每个元素都是 [0,3] 中相应元素的函数 fun。它被称为列表 list-comprehensions。打印“已执行”是因为在新列表函数fun 的形成过程中被调用(对于[0,3] 中的每个元素)。数字 0,2 和 3 没有打印,因为 fun 的返回值没有打印,而是放在新列表中。 查看新列表:
print("new list:",[fun(i) for i in [0,3]])
,
尝试做
l = [fun(i) for i in [0,3]]
这将输出
已执行
执行
执行
执行
然后只要执行l
,就会显示l
的值,即:[0,3]
所以当你执行时
>>> [fun(i) for i in [0,3]]
这会调用 fun(0)、fun(1) 等,并显示 executed
,然后显示计算值:[0,3]