Python为所有对象提供Truth Value Testing功能。这使Boolean Operators更符合所有对象的通用定义:
x or y
:如果x为false,则为y,否则为x x and y
:如果x为false,则为x,否则为y 我见过OR运算符的实际用例,例如:
ENV_VAR = os.environ.get(‘ENV_VAR’) or <default_value>
但是,我没有看到任何使用Python AND运算符的实际示例。在这里,我正在寻找AND运算符的示例,它利用了真值测试,就像上面的OR运算符示例一样。
答案 0 :(得分:1)
到目前为止,python中and
的最常见用途只是检查多个条件:
if 13 <= age <= 19 and gender == 'female':
print "it's a teenage girl"
and
的使用案例利用了x and y
返回其中一个操作数而不是返回一个布尔值的可疑事实,这些事实很少见。几乎总是有一种更清晰,更易读的方法来实现相同的逻辑。
在较旧的python代码中,您经常可以找到下面的构造,这是一个错误的尝试来复制C的三元运算符(cond ? : x : y
)的行为。
cond and x or y
它有一个缺陷:如果x
为0
,None
,''
或任何类型的假值,则会选择y
,所以它不完全等同于C版本。
以下是“固定”版本:
(cond and [x] or [y])[0]
由于python引入了conditional expression,这些和/或黑客现在已经过时了。
x if cond else y
答案 1 :(得分:0)
示例中使用的功能
os.environ.get(‘ENV_VAR’) or <default_value>
称为短路评估。如果AND和OR的这一方面是您的问题的主题,您可能会发现这篇维基百科文章很有用:
答案 2 :(得分:0)
我在这个答案中找到了and
和or
运算符的很好的示例:https://stackoverflow.com/a/28321263/5050657
直接引用答案:
Python的
or
运算符返回第一个Truth-y值或最后一个值,然后停止。这对于需要 后备 值的常见编程分配非常有用。就像这个简单的:
print my_list or "no values"
...
当您需要 后卫 and的赞美。 >而不是后备。
喜欢这个:
my_list and my_list.pop()
答案 3 :(得分:0)
当我需要获取对象的属性时,我有时会使用and
,如果它不是None
,否则会获得None
:
>>> import re
>>> match = re.search(r'\w(\d+)', 'test123')
>>> number = match and match.group(1)
>>> number
>>> '123'
>>> match = re.search(r'\w(\d+)', 'test')
>>> number = match and match.group(1)
>>> number
答案 4 :(得分:-1)
任何时候你需要一个声明,其中两件事应该是真的。例如:
# you want to see only odd numbers that are in both lists
list1 = [1,5,7,6,4,9,13,519231]
list2 = [55,9,3,20,18,7,519231]
oddNumsInBothLists = [element for element in set(list1) if element in set(list2) and element % 2]
# => oddNumsInBothLists = [7, 9, 519231]
布尔运算符,尤其是和,通常可以省略,但会牺牲可读性。当且仅当所有成员都为真时,内置函数all()
才会返回true。同样,如果函数any()
的任何成员为真,则函数shouldBeTrue = [foo() for foo in listOfFunctions]
if all(shouldBeTrue):
print("Success")
else:
print("Fail")
将返回true。
or
考虑它的一种更简单的方法可能是and
将用于代替连续的if语句,而def foobar(foo, bar):
if(foo):
return foo
if(bar):
return bar
return False
将用于代替嵌套的if语句。
def foobar(foo, bar):
return foo or bar
在功能上与:
相同def foobar(foo, bar):
if(foo):
if(bar):
return bar
return False
和
def foobar(foo, bar):
return foo and bar
在功能上与:
相同class Foo:
def __init__(self, name):
self.name = name
test1 = Foo("foo")
test2 = Foo("bar")
print((test1 or test2).name) # => foo
print((test1 and test2).name) # => bar
print((not test1 and not test2).name) # => AttributeError for 'bool' (False)
这可以通过简单的测试来证明。
Trans. ID QTY TOOL Date
1 20 A2 2015
2 20 A2 2016
3 20 A2 2016
4 20 A3 2015
5 20 A3 2016
6 20 A3 2016
7 20 C 2016
8 20 C 2016
9 20 C 2016
10 20 C 2016