Ітерація над словниками за допомогою циклів 'for'
d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
...
Як Python розпізнає, що йому потрібно лише прочитати ключ зі словника? Чи є ключовим словом спеціальне в Python? Або це просто змінна?
Це не просто for
петлі. Тут важливе слово - "повторення".
Словник - це відображення ключів до значень:
d = {'x': 1, 'y': 2, 'z': 3}
Кожен раз, коли ми повторюємо його, ми повторюємо клавіші. Ім'я змінної key
призначене лише для опису - і цілком підходить для цієї мети.
Це відбувається в розумінні списку:
>>> [k for k in d]
['x', 'y', 'z']
Це відбувається, коли ми передаємо словник до списку (або будь-якого іншого об'єкта типу колекції):
>>> list(d)
['x', 'y', 'z']
Спосіб ітерації Python в контексті, де це потрібно, він викликає __iter__
метод об'єкта (в даному випадку словник), який повертає ітератор (в даному випадку об'єкт keyiterator):
>>> d.__iter__()
<dict_keyiterator object at 0x7fb1747bee08>
Ми не повинні використовувати ці спеціальні методи самостійно, натомість використовувати відповідну вбудовану функцію, щоб викликати її iter
:
>>> key_iterator = iter(d)
>>> key_iterator
<dict_keyiterator object at 0x7fb172fa9188>
Ітератори мають __next__
метод - але ми називаємо це функцією вбудованого next
:
>>> next(key_iterator)
'x'
>>> next(key_iterator)
'y'
>>> next(key_iterator)
'z'
>>> next(key_iterator)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
Коли ітератор вичерпується, він підвищується StopIteration
. Ось як Python знає, щоб вийти з for
циклу, чи розуміння списку, або вираз генератора, або будь-який інший ітераційний контекст. Після того, як ітератор піднімає StopIteration
його, він завжди підніме його - якщо ви хочете повторити повтор, вам потрібен новий.
>>> list(key_iterator)
[]
>>> new_key_iterator = iter(d)
>>> list(new_key_iterator)
['x', 'y', 'z']
Повернення до диктів
Ми бачили дикти, що повторюються в багатьох контекстах. Що ми бачили, це те, що кожного разу, коли ми повторюємо дік, ми отримуємо ключі. Повернутися до початкового прикладу:
d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
Якщо ми змінимо ім’я змінної, ми все одно отримаємо ключі. Давайте спробуємо:
>>> for each_key in d:
... print(each_key, '=>', d[each_key])
...
x => 1
y => 2
z => 3
Якщо ми хочемо перебрати значення, нам потрібно використовувати .values
метод диктів, або для обох разом .items
:
>>> list(d.values())
[1, 2, 3]
>>> list(d.items())
[('x', 1), ('y', 2), ('z', 3)]
У наведеному прикладі було б ефективніше переглядати такі елементи:
for a_key, corresponding_value in d.items():
print(a_key, corresponding_value)
Але в академічних цілях приклад питання просто чудовий.