Pytanie Jak dokładnie działa funkcja python ()?


Na stronie Pythona dla dokumentów any, równoważny kod dla any() funkcja jest podana jako:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

W jaki sposób ta funkcja wie, jaki element chcę przetestować, jeśli wywołasz go w tej formie?

any(x > 0 for x in list)

Z definicji funkcji wszystko, co widzę, to to, że przekazuję obiekt iterowalny. W jaki sposób for pętla wiem, że czegoś szukam > 0?


76
2018-05-12 08:18


pochodzenie




Odpowiedzi:


Jeśli użyjesz any(lst) widzisz to lst jest iterable, czyli lista niektórych elementów. Jeśli zawierał [0, False, '', 0.0, [], {}, None] (które wszystkie mają wartości boolowskie False) następnie any(lst) byłoby False. Gdyby lst również zawierał którykolwiek z poniższych [-1, True, "X", 0.00001] (z których wszystkie oceniają True) następnie any(lst) byłoby True.

W opublikowanym przez Ciebie kodzie x > 0 for x in lstjest to inny rodzaj iteracji, zwany a wyrażenie generatora. Zanim dodaliśmy wyrażeń generatora do Pythona, utworzysz zrozumienie listy, który wygląda bardzo podobnie, ale z otoczeniem []'s: [x > 0 for x in lst]. Od lst zawierający [-1, -2, 10, -4, 20], dostałeś to pojęta lista: [False, False, True, False, True]. Ta wewnętrzna wartość zostanie następnie przekazana do any funkcja, która powróci True, ponieważ jest co najmniej jeden True wartość.

Ale z wyrażeń generatora, Python nie musi już tworzyć tej wewnętrznej listy True(s) i False(s), wartości będą generowane jako any funkcja iteruje poprzez wartości generowane pojedynczo przez wyrażenie generatora. I, od any zwarcia, przerwie on iterację, gdy tylko zobaczy pierwszą True wartość. Byłoby to szczególnie przydatne, jeśli stworzyłeś lst używając czegoś podobnego lst = range(-1,int(1e9)) (lub xrange jeśli używasz Python2.x). Nawet jeśli to wyrażenie wygeneruje ponad miliard wpisów, any wystarczy, gdy dotrze do trzeciego wejścia 1, który ocenia True dla x>0, a więc any może wrócić True.

Jeśli utworzyłeś zrozumienie listy, Python musiałby najpierw stworzyć listę pamięci zawierającą miliard elementów, a następnie przekazać ją any. Ale używając a wyrażenie generatora, możesz mieć wbudowane funkcje Pythona takie jak any i all wybuchnąć wcześnie, tak szybko jak True lub False wartość jest widoczna.


112
2018-05-12 08:38



Warto również o tym wspomnieć any(x > 0 for x in list) jest po prostu syntaktycznym cukrem dla any((x > 0 for x in list)). - georg
Powinieneś dodać Nonedo listy elementów, które mają wartości logiczne False - Alok Mysore
Dodając do @georg, cukier syntaktyczny nie jest wyjątkowy any. def b(x): return x; print b(x > 1 for x in xs) # prints <generator object .. - industryworker3595112


>>> names = ['King', 'Queen', 'Joker']
>>> any(n in 'King and john' for n in names)
True

>>> all(n in 'King and Queen' for n in names)
False

Po prostu redukuje kilka linii kodu w jeden. Nie musisz pisać długiego kodu, takiego jak:

for n in names:
    if n in 'King and john':
       print True
    else:
       print False

21
2018-06-08 07:29





(x > 0 for x in list) w tym wywołaniu funkcji tworzy wyrażenie generatora np.

>>> nums = [1, 2, -1, 9, -5]
>>> genexp = (x > 0 for x in nums)
>>> for x in genexp:
        print x


True
True
False
True
False

Który any używa i zwarcia przy napotykaniu pierwszego obiektu, który ocenia True


19
2018-05-12 08:21





To dlatego, że jest to iterable

(x > 0 for x in list)

Zauważ, że x > 0 zwraca albo True lub False iw ten sposób masz do czynienia z booleanami.


5
2018-05-12 08:20





Mówiąc po prostu, dowolne () to działa: zgodnie z warunkiem, nawet jeśli napotka jedną spełniającą wartość na liście, zwraca true, w przeciwnym razie zwraca false.

list = [2,-3,-4,5,6]

a = any(x>0 for x in lst)

print a:
True


list = [2,3,4,5,6,7]

a = any(x<0 for x in lst)

print a:
False

4
2018-05-05 09:37