在python中使用And /或over树对象

问题描述 投票:0回答:2

我正在阅读一些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 ??

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

python tree operators
2个回答
0
投票

andor运营商处理他们的操作数的truthiness。所以

X and Y and Z and ...

返回第一个falsey操作数,或者如果它们都是真的,则返回最后一个操作数

X or Y or Z or ...

返回第一个truthy操作数,或者如果它们都是假的,则返回最后一个操作数。

上面的链接解释了什么被认为是真实和虚假。物体总是真实的,所以

T and T.left

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

T or T.left

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

T.left and T.right

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


0
投票

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

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

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

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

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

例如使用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为假,则为x,否则为y

if not T:
    ans = T
else:
    ans = T.left
© www.soinside.com 2019 - 2024. All rights reserved.