Многие итераторные "функции" в модуле __builtin__
фактически реализуются как типы, хотя документация говорит о них как о "функциях". Возьмем, например, enumerate
. В документации указано, что она эквивалентна:
def enumerate(sequence, start=0):
n = start
for elem in sequence:
yield n, elem
n += 1
Это точно, как я бы это сделал, конечно. Тем не менее, я провел следующий тест с предыдущим определением и получил следующее:
>>> x = enumerate(range(10))
>>> x
<generator object enumerate at 0x01ED9F08>
Это то, что я ожидаю. Однако при использовании версии __builtin__
я получаю следующее:
>>> x = enumerate(range(10))
>>> x
<enumerate object at 0x01EE9EE0>
Из этого я делаю вывод, что он определен как
class enumerate:
def __init__(self, sequence, start=0):
# ....
def __iter__(self):
# ...
Вместо стандартной формы документация показывает. Теперь я могу понять, как это работает и как это эквивалентно стандартной форме, что я хочу знать, в чем причина этого. Это более эффективно? Имеет ли это какое-то отношение к выполнению этих функций на C (я не знаю, являются ли они, но я подозреваю, что так)?
Я использую Python 2.7.2, на случай, если разница важна.
Спасибо заранее.