зачем словарю нужны эти «итерационные» методы? - PullRequest
3 голосов
/ 29 марта 2012

Предположим, mydict - это словарь Python.

mydict = {'a': 1, 'b': 2}

Я могу использовать items для итерации его элементов:

for k,v in mydict.items():
    print k,v

Или используйте iteritems:

for k,v in mydict.iteritems():
    print k,v

какая разница? Я думаю, что философия Python - «только один способ сделать»?

Ответы [ 3 ]

6 голосов
/ 29 марта 2012

В Python 3 методы dict.iter...() были удалены и заменяют обычные.

Они существовали, так как итераторы были добавлены в язык после словарей, поэтому dict.items() возвращает список.Методы dict.iter...() были добавлены, чтобы позволить людям создавать более эффективные программы (поскольку итераторы ленивы), но также не нарушали совместимость со старыми программами, которые ожидали список.

Поскольку Python 3 нарушал совместимость, это было исправлено,(Старое использование dict.iter() может быть сгенерировано с помощью list(dict.iter()). Обратите внимание, что в Python 3 dict.items() фактически возвращает представление словаря - которое можно повторять, но также предоставляет другие функции.

4 голосов
/ 29 марта 2012

Я думаю, что философия питона - «только один способ сделать»?

Причина, по которой существуют items() и iteritems(), является исторической:

  1. Изначально существовал только items(). Возвращено список .

  2. В Python 2.2 введено iteritems(). Он вернул итератор .

  3. В Python 2.7 введено viewitems(). Возвращено представление .

  4. Python 3 воспользовался возможностью, чтобы привести это в порядок: iteritems() и items() были удалены и viewitems() были переименованы в items().

Причина, по которой iteritems() и viewitems() были добавлены в 2.x как новые функции вместо простой замены items(), заключалась в желании обеспечить обратную совместимость всех выпусков 2.x.

4 голосов
/ 29 марта 2012

В Python 2 mydict.items возвращает новый список .Использование iteritems экономит память и более эффективно.

>>> d = dict((f, r) for f, r in zip(range(10000), reversed(range(10000))))
>>> %timeit for i in d.iteritems(): i
1000 loops, best of 3: 456 us per loop
>>> %timeit for i in d.items(): i
1000 loops, best of 3: 811 us per loop

Но (как уже отмечали другие) items был оставлен без изменений в Python 2 для обратной совместимости.

В Python 3 эта проблема исправлена;items возвращает « представление » (которое не является ни списком, ни итератором, а скорее «динамическим представлением записей словаря», которое изменяется при изменении словаря), и iteritems больше не существуети его кузены itervalues и iterkeys.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...