为什么Python的any / all不返回找到的对象?

时间:2013-12-05 10:30:21

标签: python api monads any

Python andor运算符,返回值,而不是TrueFalse,这对以下内容非常有用:

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的一致性。

有人知道之前对此主题的讨论吗?

2 个答案:

答案 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'