Python and i or operatorzy, wartości zwracają, a nie True lub False, co jest przydatne dla takich rzeczy jak:

x = d.get(1) or d.get(2) or d.get(3)

Co zrobi x wartość d[1], d[2] lub d[3], która kiedykolwiek jest obecna. Jest to trochę jak posiadanie dodatku może monada w językach funkcjonalnych.

Zawsze chciałem, aby funkcja Pythona any() byłaby bardziej podobna do powtarzania or. Myślę, że to zrobi to sens, zwróci obiekt, który znajdzie, jak:

any([None, None, 1, 2, None]) == 1
any(notnull_iterator) = try: return next(notnull_iterator); except: return None

I podobnie dla all(). Wydaje mi się, że zmiana byłaby całkowicie kompatybilna z powrotem i zwiększa spójność przez API.

Czy ktoś wie o poprzedniej dyskusji o tym temacie?

3
Thomas Ahle 5 grudzień 2013, 14:30

2 odpowiedzi

Najlepsza odpowiedź

Myślę, że szukasz

first = lambda s: next((x for x in s if x), None)

Na przykład

first([None, None,1, 2,None]) # 1

Pytanie "Dlaczego" odpowiada na Tutaj.

4
Community 23 maj 2017, 10:25
>>> 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

W powyższym przykładzie my_all([]) podnosi wyjątek. Jednak można łatwo podać wartość domyślną

>>> my_all([], "Foo")
'Foo'
1
John La Rooy 5 grudzień 2013, 13:06