我无法理解为什么下面的代码会像这样工作。 (在Python3x中)
>>>f = lambda: print('Hello') or print('Hello again')
>>>f()
Hello
Hello again
也无法理解。
>>>f = lambda: print('Hello') and print('Hello again')
>>>f()
Hello
对我来说,第一个lambda函数似乎打印单词'Hello'或单词'Hello again',但它打印 both 'Hello'和'你好再见'。
第二个函数似乎打印出'Hello'和'Hello Hello'这个词,但它只打印'Hello'。
有人可以解释这个lambda函数的内容吗?
感谢您的帮助!
答案 0 :(得分:2)
print
返回None(这是假的),因此python必须评估or
的其他操作数,而不是and
,以获得答案。
return print('Hello') or print('Hello again')
Hello
,打印返回None
return None or print('Hello again')
or
返回True。如果第一个是True,则无需评估第二个。情况并非如此Hello again
已打印return None or None
return print('Hello') and print('Hello again')
Hello
,打印返回None
return None and print('Hello again')
and
返回True。如果第一个是假的,则无需评估第二个。return False
答案 1 :(得分:0)
这称为懒惰评估,这意味着python不会计算超出必要的计算量。在:
Expression1 or Expression2
和
Expression1 and Expression2
如果Expression1为False,在or
比较的情况下,python将需要Expression2的结果来计算结果,
但对于and
比较,如果Expression1为False,则不需要将比较的第二部分计算为0 and x == False
,无论x是True
还是False
不需要评估and
比较中的2sd函数打印,因为python已经知道比较将等于False
print
函数不会返回任何内容。返回None
>>> def print2(string):
print(string)
return True
>>> r=(lambda: print2('Hello') or print2('Hello again'))()
Hello
然而,这只会打印第一个Hello(因为它是真的)而不会再打印Hello
>>> r=(lambda: print2('Hello') and print2('Hello again'))()
Hello
Hello again
要了解延迟评估,请尝试以下命令:
>>> def p():
print("foo")
return True
>>> False and p() and p()
False
>>> True and p() and p()
foo
foo
True
>>> True and (not p()) and p()
foo
False