Python and
和or
运算符,返回值,而不是True
或False
,这对以下内容非常有用:
x = d.get(1) or d.get(2) or d.get(3)
这会使x
d[1]
,d[2]
或d[3]
的价值变为any()
。这有点像在功能语言中添加了可能monad。
我一直希望python or
函数更像是重复的any([None, None, 1, 2, None]) == 1
any(notnull_iterator) = try: return next(notnull_iterator); except: return None
。我认为返回它找到的对象会有意义,例如:
all()
同样适用于{{1}}。在我看来,更改将完全向后兼容,并提高API的一致性。
有人知道之前对此主题的讨论吗?
答案 0 :(得分:4)
我猜你正在寻找
first = lambda s: next((x for x in s if x), None)
e.g。
first([None, None,1, 2,None]) # 1
通过here回答“为什么”问题。
答案 1 :(得分:1)
>>> from functools import partial
>>> my_any = partial(reduce, lambda x, y:x or y)
>>> my_any([None, None, 1, 2, None])
1
>>> my_all = partial(reduce, lambda x, y:x and y)
>>> my_all([0, 0, 1, 2, 0])
0
在上面的示例中,my_all([])
引发了异常。但是,您可以轻松提供默认值
>>> my_all([], "Foo")
'Foo'