-2

我不明白为什么下面的代码会这样工作。(在 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”,但它同时打印“Hello”“Hello again”。

第二个函数似乎打印了单词“Hello”“Hello again”,但它只打印了“Hello”。

谁能解释这个 lambda 函数发生了什么?

感谢您的热心帮助!

4

2 回答 2

2

print返回 None (这是 Falseish),因此 python 必须评估 的另一个操作数or,但不是and,才能得到答案。

  • return print('Hello') or print('Hello again')
  • Hello被打印,打印返回None
  • return None or print('Hello again')
  • or如果任何操作数为 True,则返回 True。如果第一个为 True,则无需评估第二个。事实并非如此
  • Hello again被打印
  • return None or None
  • 现在我们确定 False 应该返回。

 

  • return print('Hello') and print('Hello again')
  • Hello被打印,打印返回None
  • return None and print('Hello again')
  • and如果两个操作数都为 True,则返回 True。如果第一个为 False,则无需评估第二个。
  • return False
于 2013-01-19T09:37:57.937 回答
0

这称为惰性求值,这意味着 python 不会计算超出必要的值。在:

Expression1 or Expression2

Expression1 and Expression2

如果 Expression1 为 False,则在or比较的情况下,python 将需要 Expression2 的结果来计算结果,但and如果 Expression1 为 False,则无需计算比较的第二部分,0 and x == False无论 x isTrue或比较中False 的 2sd 函数 printand不需要计算,因为 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
于 2013-01-19T10:38:00.343 回答