2013-01-19 56 views
-2

我不明白为什么下面的代码是这样工作的。 (在Python3x中)'或'和'和'Python3x评估

>>>f = lambda: print('Hello') or print('Hello again') 

>>>f() 

Hello 

Hello again 

也不能这样理解。

>>>f = lambda: print('Hello') and print('Hello again') 

>>>f() 

Hello 

对于我来说,第一拉姆达功能似乎“又见面了”打印单词“你好” 这个词,但它打印“你好” “大家好”。

第二个函数似乎打印单词'你好''再次问候',但它只打印'你好'。

任何人都可以解释这个lambda函数是怎么回事?

谢谢你的帮助!

回答

3

print返回无(这是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
  • 现在我们有一定的假应当归还的情况。

 

  • return print('Hello') and print('Hello again')
  • Hello被打印出来,如果两个操作数都是真打印返回None
  • return None and print('Hello again')
  • and返回true。如果第一个是False,则不需要评估第二个。
  • return False
+0

感谢您的快速响应! 我明白了。 – y4suyuki

0

这就是所谓的懒惰评估,这意味着Python将不计算超过必要的。在:

Expression1 or Expression2 

Expression1 and Expression2 

如果表达式1为假,在or比较蟒蛇的情况下,将需要表达式2的结果来计算结果, 但对于and比较,如果表达式1是假的,则不需要计算比较的第二部分作为0 and x == False无论x是否为TrueFalseand比较中打印的2sd函数不需要被评估为蟒蛇已经知道,比较将等于False

print函数不会返回任何东西I.e.返回None

>>> def print2(string): 
    print(string) 
    return True 

>>> r=(lambda: print2('Hello') or print2('Hello again'))() 
Hello 

然而,这将只打印了第一个Hello(因为它是真实的),从此再也

>>> r=(lambda: print2('Hello') and print2('Hello again'))() 
Hello 
Hello again 

的Hello了解懒惰的评价,请尝试以下命令:

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