在我的项目中,我已经使用过,但在某些情况下它可以使用,但在某些情况下它会让我感到不舒服。 我不明白为什么?
if (a or b) is not True:
# This works for me
if (a or b) == "Django" and (c or d) == "Pyramid":
# This fails me everytime
答案 0 :(得分:3)
a or b
评估为a
,则 a
评估为True
。如果a
评估为False
,则a or b
评估为b
。
例如:
[] or 'a' #evaluates to 'a'
'a' or None #evaluates to 'a'
[] or None #evaluates to None
None or [] #evaluates to []
您的(a or b) == 'Django'
应为a == 'Django' or b == 'Django'
。
('Django' or 'Nomatterwhat') == 'Django' #True
([] or 'Django') == 'Django' #True
('Mono' or 'Django') == 'Django' #False
说完理论部分后,尝试运行这个小程序,看看or
和and
是如何工作的(特别是懒惰的评估部分):
def x():
print('X')
return False
def y():
print('Y')
return True
print ('-' * 20)
x() or y()
print ('-' * 20)
y() or x()
print ('-' * 20)
x() and y()
print ('-' * 20)
y() and x()
答案 1 :(得分:1)
如果a ==' Django'或者b ==' Django':
答案 2 :(得分:0)
你的括号在错误的地方。 (a or b)
将始终返回评估为True的a
或b
中的第一个,因此:
>>> a = "Django"
>>> b = "Pyramid"
>>> (a or b)
"Django"
>>> (a or b) == "Django"
True
但是
>>> (b or a)
"Pyramid"
>>> (b or a) == "Django"
False
你真正想写的是:
>>> a == "Django" or b == "Django"
True
然而,在许多情况下编写它的另一种方法是:
if "Django" in (a, b) or "Pyramid" in (a, b):
...
或者,如果有很多选择:
if set([a, b, c, ...]) & set(["Django", "Pyramid", ...]):
...