如何在python中使用or运算符

如何在python中使用or运算符,python,Python,在我的项目中,我使用了or,但在某些情况下它有效,在某些情况下它使我失败。。 我不明白为什么 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 a或b计算结果为a如果a计算结果为True。如果a的计算结果为False,a或b的计算结果为b 例如: [] or 'a' #evaluat

在我的项目中,我使用了or,但在某些情况下它有效,在某些情况下它使我失败。。 我不明白为什么

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

a或b
计算结果为
a
如果
a
计算结果为
True
。如果
a
的计算结果为
False
a或b
的计算结果为
b

例如:

[] or 'a' #evaluates to 'a'
'a' or None #evaluates to 'a'
[] or None #evaluates to None
None or [] #evaluates to []
你的
(a或b)='Django'
应该是
a=='Django'或b=='Django'

('Django' or 'Nomatterwhat') == 'Django' #True
([] or 'Django') == 'Django' #True
('Mono' or 'Django') == 'Django' #False

说到理论部分,试着运行这个小程序,看看
是如何工作的(尤其是惰性评估部分):


a或b
计算结果为
a
如果
a
计算结果为
True
。如果
a
的计算结果为
False
a或b
的计算结果为
b

例如:

[] or 'a' #evaluates to 'a'
'a' or None #evaluates to 'a'
[] or None #evaluates to None
None or [] #evaluates to []
你的
(a或b)='Django'
应该是
a=='Django'或b=='Django'

('Django' or 'Nomatterwhat') == 'Django' #True
([] or 'Django') == 'Django' #True
('Mono' or 'Django') == 'Django' #False

说到理论部分,试着运行这个小程序,看看
是如何工作的(尤其是惰性评估部分):


如果a=='Django'或b=='Django':

如果a=='Django'或b=='Django':

你的括号放错地方了
(a或b)
将始终返回计算结果为True的
a
b
中的第一个,因此:

>>> a = "Django"
>>> b = "Pyramid"
>>> (a or b)
"Django"
>>> (a or b) == "Django"
True
但是

你真正想写的是:

>>> a == "Django" or b == "Django"
True
然而,在许多情况下,另一种可能更好的书写方式是:

if "Django" in (a, b) or "Pyramid" in (a, b):
    ...
或者,如果有很多选择:

if set([a, b, c, ...]) & set(["Django", "Pyramid", ...]):
    ...

你的括号放错地方了
(a或b)
将始终返回计算结果为True的
a
b
中的第一个,因此:

>>> a = "Django"
>>> b = "Pyramid"
>>> (a or b)
"Django"
>>> (a or b) == "Django"
True
但是

你真正想写的是:

>>> a == "Django" or b == "Django"
True
然而,在许多情况下,另一种可能更好的书写方式是:

if "Django" in (a, b) or "Pyramid" in (a, b):
    ...
或者,如果有很多选择:

if set([a, b, c, ...]) & set(["Django", "Pyramid", ...]):
    ...

你应该阅读这些文件——你不知道“或”到底在做什么;-)你应该阅读这些文件——你不知道“或”到底在做什么;-)@KDawG已修复。谢谢。从你给我的答案中没有第二个问题了……谢谢。这是一个小问题,但在python中,
yield
有一个特定的含义,即w.r.t.生成器和迭代器,所以从技术上讲,
[]或“a”不能
产生任何东西。@aquavitae请查看我对你答案的问题。我真的很好奇。@KDawG已修复。谢谢。从你给我的答案中没有第二个问题了……谢谢。这是一个小问题,但在python中,
yield
有一个特定的含义,即w.r.t.生成器和迭代器,所以从技术上讲,
[]或“a”不能
产生任何东西。@aquavitae请查看我对你答案的问题。我真的很感兴趣。在哪个版本的python中,在哪个实现中将
'Django'或'Pyramid'
解析为
True
?更有趣的是:为什么
('Django'或'Pyramid')=='Django'
应该是
False
?我在3.3和2.7(cython)中都试过了,在这两个版本中,我得到的结果与您发布的完全不同。对不起,输入错误!应该是“Django”,如果(a,b)中的“Django”或(a,b)中的“Pyramid”起作用,我会更正答案并使意思更清楚。。。这是一个很好的练习吗???@manjusha没有错。另请参阅
all
any
的文档。在哪个版本的python和哪个实现中将
'Django'或'Pyramid'
解析为
True
?更有趣的是:为什么
('Django'或'Pyramid')=='Django'
应该是
False
?我在3.3和2.7(cython)中都试过了,在这两个版本中,我得到的结果与您发布的完全不同。对不起,输入错误!应该是“Django”,如果(a,b)中的“Django”或(a,b)中的“Pyramid”起作用,我会更正答案并使意思更清楚。。。这是一个很好的练习吗???@manjusha没有错。另请参阅
all
any
的文档。