Является ли some_dict.items () итератором в Python? - PullRequest
0 голосов
/ 02 сентября 2018

Я немного растерялся из-за разницы между итераторами и итераторами. Я много читал и получил много:

Итератор : объект, имеющий __next__ в своем классе. Вы можете вызвать next () на нем. Все итераторы являются итеративными.

Итерируемый : Объект, который определяет __iter__ или __getitem__ в своем классе. Что-то итеративное, если оно может создать итератор с помощью iter (). Не все итерации являются итераторами.

Является ли some_dict.items() итератором? Я знаю, что some_dict.iteritems() будет в Python2, верно?

Я просто проверяю, потому что курс, который я делаю, говорит, что это так, и я уверен, что это просто итерация (не итератор).

Спасибо за вашу помощь:)

Ответы [ 4 ]

0 голосов
/ 02 сентября 2018

dict.items возвращает расширенный вид , в соответствии с документами :

In [5]: d = {1: 2}

In [6]: next(d.items())
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-945b6258a834> in <module>()
----> 1 next(d.items())

TypeError: 'dict_items' object is not an iterator

In [7]: next(iter(d.items()))
Out[7]: (1, 2)

Отвечая на ваш вопрос, dict.items не является итератором. Это повторяемый объект, который поддерживает len, __contains__ и отражает изменения, внесенные в исходный текст:

In [14]: d = {1: 2, 3: 4}

In [15]: it = iter(d.items())

In [16]: next(it)
Out[16]: (1, 2)

In [17]: d[3] = 5

In [18]: next(it)
Out[18]: (3, 5)
0 голосов
/ 02 сентября 2018

Нет, это не так. Это повторяемое представление элементов в dict:

>>> next({}.items())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'dict_items' object is not an iterator
>>>

Это __iter__ метод возвращает специализированный экземпляр итератора:

>>> iter({}.items())
<dict_itemiterator object at 0x10478c1d8>
>>>
0 голосов
/ 02 сентября 2018

Проверьте сами:

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

it = d.items()
print(next(it))

В результате получается TypeError: 'dict_items' object is not an iterator.

С другой стороны, вы всегда можете перебрать d.items() как:

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

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

Или:

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

it = iter(d.items())
print(next(it))  # ('a', 1)
print(next(it))  # ('b', 2)
0 голосов
/ 02 сентября 2018

Вы можете проверить это напрямую:

from collections import Iterator, Iterable

a = {}
print(isinstance(a, Iterator))  # -> False
print(isinstance(a, Iterable))  # -> True
print(isinstance(a.items(), Iterator))  # -> False
print(isinstance(a.items(), Iterable))  # -> True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...