Python-打印并返回for循环

Python-打印并返回for循环,python,for-loop,return,list-comprehension,Python,For Loop,Return,List Comprehension,我刚刚开始学习Python。我从作者用来解释短路的代码中看到了一个有趣的代码。代码如下: >>> def fun(i): ... print "executed" ... return i ... 我试着称之为乐趣(1)。输出如下,对我来说非常有意义 >>> fun(1) executed 1 然后我尝试了[0,1,2,3][fun(I)for I in[0,1,2,3]],结果如下: >>> [fu

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

>>> def fun(i):
...     print "executed"
...     return i
... 
我试着称之为乐趣(1)。输出如下,对我来说非常有意义

>>> fun(1)
executed
1
然后我尝试了[0,1,2,3][fun(I)for I in[0,1,2,3]],结果如下:

>>> [fun(i) for i in [0, 1, 2, 3]]
executed
executed
executed
executed
[0, 1, 2, 3]
executed
0
executed
1
executed
2
executed
3
我期待着这样的事情:

>>> [fun(i) for i in [0, 1, 2, 3]]
executed
executed
executed
executed
[0, 1, 2, 3]
executed
0
executed
1
executed
2
executed
3
谁能告诉我我做错了什么?谢谢大家!

试试看

l = [fun(i) for i in [0, 1, 2, 3]]
这将输出

已执行
已执行
已执行
执行

然后只需执行
l
,这将显示
l
的值,也就是说:
[0,1,2,3]

所以当你执行的时候

>>> [fun(i) for i in [0, 1, 2, 3]]
这将调用fun(0)、fun(1)等,并显示执行的
,然后显示计算值:
[0,1,2,3]
尝试执行

l = [fun(i) for i in [0, 1, 2, 3]]
这将输出

已执行
已执行
已执行
执行

然后只需执行
l
,这将显示
l
的值,也就是说:
[0,1,2,3]

所以当你执行的时候

>>> [fun(i) for i in [0, 1, 2, 3]]
这将调用fun(0)、fun(1)等,并显示执行的
,然后显示计算值:
[0,1,2,3]
尝试以下操作:

def fun(i):
    print("executed\n", i)

for i in range(4)
    fun(i)
试试这个:

def fun(i):
    print("executed\n", i)

for i in range(4)
    fun(i)

在此上下文中,方形括号形成一个新列表,每个元素都是[0,1,2,3]中相应元素的函数。它被称为列表 . 打印“已执行”是因为在新列表函数的形成过程中调用了fun(对于[0,1,2,3]中的每个元素)。不会打印数字0、1、2和3,因为不会打印fun的返回值,而是将其放入新列表中。 要查看新列表,请执行以下操作:

print("new list:",[fun(i) for i in [0, 1, 2, 3]])

在此上下文中,方形括号形成一个新列表,每个元素都是[0,1,2,3]中相应元素的函数。它被称为列表 . 打印“已执行”是因为在新列表函数的形成过程中调用了fun(对于[0,1,2,3]中的每个元素)。不会打印数字0、1、2和3,因为不会打印fun的返回值,而是将其放入新列表中。 要查看新列表,请执行以下操作:

print("new list:",[fun(i) for i in [0, 1, 2, 3]])
这不是短路的例子。这是一个有副作用的函数——它会写入标准输出,除了返回一个值之外,这也是一个可观察的效果

[fun(i) for i in [0, 1, 2, 3]]
这是
列表
理解。一般来说,您应该有充分的理由在这种情况下使用具有副作用的函数,下面解释理解
列表的动机:

>>> def fun(i):
...     print "executed"
...     return i
... 
列表理解提供了在中创建列表的更简洁的方法 使用
map()
filter()
和/或嵌套循环的情况 目前正在使用

因此,阅读您的代码的人可能会认为它只需要创建列表,而不需要在此操作期间打印元素

这不是短路的例子。这是一个有副作用的函数——它会写入标准输出,除了返回一个值之外,这也是一个可观察的效果

[fun(i) for i in [0, 1, 2, 3]]
这是
列表
理解。一般来说,您应该有充分的理由在这种情况下使用具有副作用的函数,下面解释理解
列表的动机:

>>> def fun(i):
...     print "executed"
...     return i
... 
列表理解提供了在中创建列表的更简洁的方法 使用
map()
filter()
和/或嵌套循环的情况 目前正在使用


因此,阅读您的代码的人可能会认为它只需要创建列表,而不需要在此操作期间打印元素。

[0,1,2,3]
是列表理解的结果,
[..for..in..]
完成后输出。在创建该列表的过程中,首先执行了一组
print
语句。FWIW,所有这些都与短路无关。您可以从和课程材料中了解有关此主题的更多信息。短路是使用布尔结果来避免进一步执行(如果你已经有了一个真实的结果,就不需要在
调用上执行更多)。我不知道你期望什么,但我猜你错过了某个地方对
any
的调用。我建议重新阅读关于另一个问题的解释:)FWIW,你不应该在这个时代学习Python 2,它已经死了十年了。学习Python 3。
[0,1,2,3]
是列表理解的结果,
[..for..in..]
,完成后输出。在创建该列表的过程中,首先执行了一组
print
语句。FWIW,所有这些都与短路无关。您可以从和课程材料中了解有关此主题的更多信息。短路是使用布尔结果来避免进一步执行(如果你已经有了一个真实的结果,就不需要在
调用上执行更多)。我不知道你期望什么,但我猜你错过了某个地方对
any
的调用。我建议重新阅读关于另一个问题的解释:)FWIW,你不应该在这个时代学习Python 2,它已经死了十年了。了解Python 3。如果您还没有了解“range()”函数的作用,它将简单地循环0到3之间的数字序列。如果您还没有了解“range()”函数的作用,它将简单地循环0到3之间的数字序列。