Генератор - это просто функция, которая возвращает объект, по которому вы можете вызвать следующий, так что для каждого вызова оно возвращает некоторое значение, пока оно не вызывает исключение StopIteration, сигнализируя, что все значения были сгенерированы. Такой объект называется итератором.
>>> def myGen(n):
... yield n
... yield n + 1
...
>>> g = myGen(6)
Я процитировал это из Понимание генераторов в Python?
Вот что я пытаюсь выяснить:
-
Каков генератор?
myGen
илиmyGen(6)
?Согласно цитированной выше цитате, я думаю, что генератор должен быть
myGen
. ИmyGen(6)
- это возвращаемый объект итератора. Но я действительно не уверен в этом. -
Когда я попробовал это:
>>> type(myGen) <type 'function'> >>> type(g) # <1>this is confusing me. <type 'generator'> >>> callable(g) # <2> g is not callable. False >>> callable(myGen) True >>> g is iter(g) # <3> so g should an iterable and an iterator True # at the same time. And it will be passed as an argument >>> for i in g: # to built-in function `next()` in a "for...in..." loop. print i # (is that correct?) 6 7
Итак, согласно <1>
и <2>
, g
type является "генератором", и он не может быть вызван.
Но генераторы вызываются, а вызов генератора получает объект-итератор
Что здесь происходит?
Когда я искал ответы, я сталкивался с Каждый раз, когда вы определяете функцию, python создает вызываемый объект.
Итак, могу ли я сказать что-то вроде этого? когда определена функция myGen
, myGen
- это имя, относящееся к вызываемому объекту, который является экземпляром класса, который имеет метод __call__
.
В этом случае myGen
является генератором, а myGen(6)
является возвращенным итератором при вызове myGen
.
Но почему type(g)
возвращает <type 'generator'>
вообще?
И эта возвращаемая вещь iterator
также выглядит подозрительной для меня, поскольку в этой функции нет инструкции return
.