我正在阅读一些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
运营商处理他们的操作数的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
不是假的。
你必须从根本上理解真值测试和布尔运算符。
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