我发现自己很多次,我需要全部或至少一个等于某物的东西,我会写这样的东西:
if a==1 and b==1:
do something
或者
if a==1 or b==1:
do something
如果事情的数量很少,它可以,但它仍然不优雅。那么,有没有更好的方法来处理大量的事情,做上面的事情?谢谢。
我发现自己很多次,我需要全部或至少一个等于某物的东西,我会写这样的东西:
if a==1 and b==1:
do something
或者
if a==1 or b==1:
do something
如果事情的数量很少,它可以,但它仍然不优雅。那么,有没有更好的方法来处理大量的事情,做上面的事情?谢谢。
选项1:任何/全部
if all(x == 1 for x in a, b, c, d):
if any(x == 1 for x in a, b, c, d):
您还可以使用任何可迭代的:
if any(x == 1 for x in states):
选项 2 - 链接和输入
对于您的第一个示例,您可以使用布尔运算符链接:
if a == b == c == d == 1:
对于您的第二个示例,您可以使用in
:
if 1 in states:
选项 3:没有谓词的任何/全部
如果您只关心该值是否真实,则可以进一步简化:
if any(flags):
if all(flags):
看一下这个
if all(x >= 2 for x in (A, B, C, D)):
其中 A,B,C,D 都是变量...
我喜欢这种形式,因为它在 Python 中易于理解
def cond(t,v):
return t == v
a=1
b=3
tests=[(a,1),(b,2)]
print any(cond(t,v) for t,v in tests) # eq to OR
print all(cond(t,v) for t,v in tests) # eq to AND
印刷:
True
False
然后cond()
可以根据需要变得复杂。
您可以提供用户可调用或使用操作员模块以获得更大的灵活性:
import operator
def condOP(t,v,op=operator.eq):
return op(t,v)
a=1
b=3
tests=[(a,1,operator.eq),(b,2,operator.gt)]
print any(condOP(*t) for t in tests) # eq to OR
print all(condOP(*t) for t in tests) # eq to AND
或者更简单:
tests=[(a,1,operator.eq),(b,2,operator.gt)]
print any(func(t,v) for t,v,func in tests) # eq to OR
print all(func(t,v) for t,v,func in tests) # eq to AND