在 python 中对树对象使用 And / Or

Using And / Or over tree objects in python

我浏览了一些 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 ??

and/or 运算符在这里如何工作?我尝试查找 google,但它只向我展示了基本的 and/or 内容 :(.

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

X and Y and Z and ...

return是第一个假操作数,如果它们都是真值,则为最后一个操作数,而

X or Y or Z or ...

return是第一个真操作数,如果它们都是假的,则为最后一个操作数。

上面的 link 解释了什么是真假。对象总是真实的,所以

T and T.left

将始终 return T.left 因为 T 永远不会是第一个假操作数。反之

T or T.left

将始终 return T 因为它是第一个真值操作数。

T.left and T.right

returns T.right 因为 T.left 不是假的。

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

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

请注意,or 运算符 returns 是两个参数之一:

x or y If x is false, then y, else x

这是一个常用于检查是否为假的成语,通常是 None 或一个空容器。

例如如果 x 不是 None,则使用 x 否则使用其他东西...所以一个快捷方式:

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

and 运算符也是 returns 它的参数之一:

x and y if x is false, then x, else y

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