在python

时间:2018-02-22 22:27:22

标签: python tree operators

我正在阅读一些Python笔记,我看到了这个例子和它的工作发现,但我想了解发生了什么。

 class TreeNode(object):
 def __init__(self, x):
     self.val = x
     self.left = None
      self.right = None



 T= TreeNode(5)
 T.left = TreeNode(2)
 T.right = TreeNode(7)

 ans = T and T.left   #===> This returns T.left, <--------- how?
 ans2 = T or T.left   #===> This returns T .  <-------------?

 ans3 = T.left and T.right #====> T.right <----- mind blows away :(, how , how ??

如何和/或运营商在这里工作?我试着在谷歌上查看,但它只是向我展示了基本和/或东西:(。

2 个答案:

答案 0 :(得分:0)

andor运算符处理其操作数的truthiness。所以

X and Y and Z and ...

返回第一个falsey操作数,如果它们全部真实,则返回最后一个操作数,而

X or Y or Z or ...

返回第一个truthy操作数,或者如果它们全部为false,则返回最后一个操作数。

上面的链接解释了什么是真实的和虚假的。对象总是很简洁,所以

T and T.left

将始终返回T.left,因为T永远不会是第一个虚假操作数。相反

T or T.left

将始终返回T,因为它是第一个真正的操作数。

T.left and T.right

返回T.right,因为T.left不是假的。

答案 1 :(得分:0)

你必须从根本上理解真值测试和布尔运算符。

https://docs.python.org/3.6/library/stdtypes.html

注意,or运算符返回其中一个参数:

  

x or y如果x为假,则为y,否则为x

这是一种经常被用来检查某些东西是否有问题的习惯用法,通常是None或空容器。

e.g。如果x不是x,请使用None否则使用其他内容...所以快捷方式为:

if not T:
    ans = T.left
else:
    ans = T

我更喜欢完整的if-else,或者如果你想要一些可以放在一行上的东西,请使用conditional expression

ans = T.left if not T else T

ans = T if T else T.left

和运算符也返回其中一个参数:

  

x and y如果x为false,则为x,否则为y

if not T:
    ans = T
else:
    ans = T.left