W powłoce Pythona, jeśli wprowadzę zrozumienie listy, takie jak:
>>> [x for x in string.letters if x in [y for y in "BigMan on campus"]]
Otrzymuję ładnie wydrukowany wynik:
['a', 'c', 'g', 'i', 'm', 'n', 'o', 'p', 's', 'u', 'B', 'M']
To samo dotyczy rozumienia ze słownika:
>>> {x:x*2 for x in range(1,10)}
{1: 2, 2: 4, 3: 6, 4: 8, 5: 10, 6: 12, 7: 14, 8: 16, 9: 18}
Jeśli wpisuję wyrażenie generatora, nie otrzymuję tak przyjaznej odpowiedzi:
>>> (x for x in string.letters if x in (y for y in "BigMan on campus"))
<generator object <genexpr> at 0x1004a0be0>
Wiem, że potrafię to zrobić:
>>> for i in _: print i,
a c g i m n o p s u B M
Poza tym (lub pisząc funkcję pomocniczą) czy mogę łatwo ocenić i wydrukować ten obiekt generatora w powłoce interaktywnej?
generator object
gdy interaktywnie buduję zrozumienie w interaktywnym monicie. Dzwonienie tolist(_)
robi. To, co zrobiłem, to użycie list złożonych, a następnie przekształcenie ich w genexp w większym kodzie. Mogą one zakończyć się niepowodzeniem w czasie wykonywania w sposób, w jaki nie ma to ze składanymi listami.list()
, a następnie je wydrukować.Odpowiedzi:
Szybka odpowiedź:
Obchodzenie
list()
się z wyrażeniem generatora jest (prawie) dokładnie równoważne z[]
otaczaniem go nawiasami. Więc tak, możesz to zrobićAle równie dobrze możesz to zrobić
Tak, to zmieni wyrażenie generatora w rozumienie listy. To to samo i lista wywołań () na nim. Tak więc sposobem na przekształcenie wyrażenia generatora w listę jest umieszczenie wokół niego nawiasów.
Szczegółowe wyjaśnienie:
Wyrażenie generatora to wyrażenie „nagie”
for
. Tak jak to:Teraz nie możesz umieścić tego samego w linii, otrzymasz błąd składni. Ale możesz umieścić to w nawiasach.
Nazywa się to czasem zrozumieniem generatora, chociaż myślę, że oficjalna nazwa nadal jest wyrażeniem generatora, tak naprawdę nie ma żadnej różnicy, nawiasy są tylko po to, aby składnia była poprawna. Nie potrzebujesz ich, jeśli przekazujesz je jako jedyny parametr do funkcji, na przykład:
Zasadniczo wszystkie inne wyrażenia dostępne w Pythonie 3 i Pythonie 2.7 to po prostu cukier syntaktyczny wokół wyrażenia generatora. Zestaw pojęć:
Rozumienie ze zrozumieniem:
I listy składanych w Pythonie 3:
W Pythonie 2 listy składane to nie tylko cukier składniowy. Ale jedyna różnica polega na tym, że x pod Pythonem 2 przecieka do przestrzeni nazw.
Będąc pod Pythonem 3, otrzymasz
Oznacza to, że najlepszym sposobem na uzyskanie ładnego wydruku zawartości wyrażenia generatora w Pythonie jest zrobienie z niego zrozumienia listy! Jednak to oczywiście nie zadziała, jeśli masz już obiekt generatora. Spowoduje to utworzenie listy jednego generatora:
W takim przypadku będziesz musiał zadzwonić
list()
:Chociaż to działa, ale jest trochę głupie:
źródło
list( generator-expression )
nie drukuje wyrażenia generatora; generuje listę (a następnie drukuje ją w interaktywnej powłoce). Zamiast generować listę, w Pythonie 3 można zamieścić wyrażenie generatora na instrukcję print. Tjprint(*(generator-expression))
. ) . Wypisuje elementy bez przecinków i bez nawiasów na początku i na końcu.W przeciwieństwie do listy lub słownika, generator może być nieskończony. To nie zadziała:
Ponadto czytanie generatora zmienia to, więc nie ma idealnego sposobu, aby go wyświetlić. Aby zobaczyć próbkę wyjścia generatora, możesz to zrobić
źródło
[next(g1) for i in range(10)]
w Pythonie 3.Możesz po prostu zawinąć wyrażenie w wywołanie
list
:źródło
Lub zawsze możesz
map
nad iteratorem, bez potrzeby tworzenia listy pośredniej:źródło
źródło