Python3x中的'或'和'和'评估

时间:2013-01-19 09:36:03

标签: python

我无法理解为什么下面的代码会像这样工作。 (在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函数的内容吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

print返回None(这是假的),因此python必须评估or的其他操作数,而不是and,以获得答案。

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

  • return print('Hello') and print('Hello again')
  • 打印
  • Hello,打印返回None
  • return None and print('Hello again')
  • 如果两个操作数均为True,则
  • 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