Korzystanie yield
włącza funkcję w generator. Generator jest wyspecjalizowanym typem iterator. for
zawsze pętle nad iterabelami, biorąc po kolei każdy element i przypisując go do wymienionych nazw.
spinning_cursor()
zwraca generator, kod wewnątrz spinning_cursor()
faktycznie nie działa, dopóki nie rozpoczniesz iteracji nad generatorem. Iteracja po generatorze oznacza, że kod w funkcji jest wykonywany, dopóki nie natrafi na instrukcję yield
, w którym to punkcie wynik wyrażenia zostanie zwrócony jako następna wartość, a wykonanie zostanie ponownie wstrzymane.
Pętla for
nie tylko, że on zadzwoni równowartość next()
na generatorze, dopóki generator sygnalizuje to odbywa się poprzez podniesienie StopIteration
(co zdarza się, gdy funkcja zwraca). Każdej zwróconej wartości next()
przypisuje się z kolei do c
.
Widać to poprzez stworzenie generatora na w wierszu Python:
>>> def spinning_cursor():
... cursor='/-\|'
... i = 0
... while 1:
... yield cursor[i]
... i = (i + 1) % len(cursor)
...
>>> sc = spinning_cursor()
>>> sc
<generator object spinning_cursor at 0x107a55eb0>
>>> next(sc)
'/'
>>> next(sc)
'-'
>>> next(sc)
'\\'
>>> next(sc)
'|'
Ten specyficzny generator nigdy nie wraca, więc StopIteration
nie jest podnoszony i pętla for
będzie trwać wiecznie, jeśli nie zabić skrypt.
Inny przykład? dla i w zakresie (10): print (i) – antoyo
możesz znaleźć wszystko tutaj: http://stackoverflow.com/questions/231767/the-python-yield-keyword-explained – pylover
Kolejny przykład, jak wydajność działała z funkcja tutaj ... Nie potrzebuję teraz przykładu, który rozumiem. Ponadto, dzięki @pylover – Paul