for key in d: print(key, 'corresponds to', d[key])
Как Python распознает, что ему нужно только прочитать key из словаря? Это key специальное ключевое слово или это просто переменная?
Переведено автоматически
Ответ 1
key это просто имя переменной.
for key in d:
будет просто перебирать ключи в словаре, а не ключи и значения. Для перебора ключей и значений вы можете использовать следующее:
Для Python 3.x:
for key, value in d.items():
Для Python 2.x:
for key, value in d.iteritems():
Чтобы проверить самостоятельно, измените слово key на poop.
В Python 3.x, iteritems() был заменен на simply items(), который возвращает представление, подобное set, поддерживаемое dict, как iteritems() но даже лучше. Это также доступно в версии 2.7 как viewitems().
Операция items() будет работать как для 2, так и для 3, но в 2 она вернет список (key, value) пар словаря, который не будет отражать изменения в dict, которые происходят после items() вызова. Если вам нужно поведение 2.x в 3.x, вы можете вызвать list(d.items()).
Ответ 2
Дело не в том, что key - это специальное слово, а в том, что словари реализуют протокол итератора. Вы могли бы сделать это в своем классе, например, смотрите Этот вопрос о том, как создавать итераторы классов.
В случае со словарями это реализовано на уровне C. Подробности доступны в PEP 234. В частности, в разделе, озаглавленном "Итераторы словарей".:
Словари реализуют слот tp_iter, который возвращает эффективный итератор, выполняющий перебор ключей словаря. [...] Это означает, что мы можем написать
for k indict: ...
что эквивалентно, но намного быстрее, чем
for k indict.keys(): ...
при условии, что ограничение на модификации словаря (либо циклом, либо другим потоком) не нарушается.
Добавление методов в словари, которые явно возвращают различные типы итераторов:
for key indict.iterkeys(): ...
for value indict.itervalues(): ...
for key, value indict.iteritems(): ...
Это означает, что for x in dict является сокращением для for x in dict.iterkeys().
В Python 3 dict.iterkeys(), dict.itervalues() и dict.iteritems() больше не поддерживаются. Вместо этого используйте dict.keys(), dict.values() и dict.items().
Ответ 3
Перебор через a dict перебирает его ключи в произвольном порядке, как вы можете видеть здесь:
Для вашего примера лучше использовать dict.items():
>>> d.items() [('y', 2), ('x', 1), ('z', 3)]
Это дает вам список кортежей. Когда вы перебираете их подобным образом, каждый кортеж автоматически распаковывается в k и v:
for k,v in d.items(): print(k, 'corresponds to', v)
Использование k и v в качестве имен переменных при выполнении цикла над a dict довольно распространено, если тело цикла состоит всего из нескольких строк. Для более сложных циклов может оказаться хорошей идеей использовать более описательные имена:
for letter, number in d.items(): print(letter, 'corresponds to', number)
Неплохо бы привыкнуть использовать строки формата:
for letter, number in d.items(): print('{0} corresponds to {1}'.format(letter, number))
Ответ 4
key это просто переменная.
Для Python 3.x:
>>> d = {'x': 1, 'y': 2, 'z': 3} >>> for the_key, the_value in d.items(): ... print(the_key, 'corresponds to', the_value) ... x corresponds to 1 y corresponds to 2 z corresponds to 3
Для Python 2.x:
>>> d = {'x': 1, 'y': 2, 'z': 3} >>> for my_var in d: >>> print my_var, 'corresponds to', d[my_var]
x corresponds to 1 y corresponds to 2 z corresponds to 3
... или лучше,
d = {'x': 1, 'y': 2, 'z': 3}
for the_key, the_value in d.iteritems(): print the_key, 'corresponds to', the_value