Python - 在 for 循环中打印和返回

问题描述

我刚刚开始学习 Python。我在 here 中看到了一段有趣的代码,作者用它来解释短路。代码如下:

>>> def fun(i):
...     print "executed"
...     return i
... 

我尝试调用 fun(1)。输出如下,对我来说很有意义。

>>> 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]

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...