Изучайте Python трудным путем — упражнение 39

В упражнении 39 книги Learn Python The Hard Way строки с 37 по 39 выглядят так:

print "-"*10
for state, abbrev in states.items():
    print "%s has the city %s" % (state, abbrev)

Я думал, что понял это. Я думал, что Python берет КЛЮЧ: ЗНАЧЕНИЕ из «состояний» и назначает КЛЮЧ «состоянию», а ЗНАЧЕНИЕ — «аббревиатуре».

Однако я обнаружил, что произошло что-то странное, когда я ввел следующий код:

print "-"*10
for test in states.items():
    print "%s has the city %s" % (test)

Он производит тот же результат, что и исходный код. Но это работает только в том случае, если вы дважды поместите %s в оператор печати.

Может кто-нибудь объяснить, что происходит с «тестом»? Что такое "тест"? Это кортеж? Кажется, он содержит как KEY, так и VALUE из states.items().

Я просмотрел некоторые другие вопросы по упражнению 39 здесь и не нашел такого же запроса.

Код указан ниже (для Python 2.7)

# create a mapping of state to abbreviation

states = {
    'Oregan': 'OR',
    'Florida': 'FL',
    'California': 'CA',
    'New York' : 'NY',
    'Michigan' : 'MI'
    }

print "-"*10
for state, abbrev in states.items():
    print "%s has the city %s" % (state, abbrev)

print "-"*10
for test in states.items():
    print "%s has the city %s" % (test)

person alfo35x    schedule 13.03.2016    source источник
comment
вам не нужно использовать state.items(), словарь по умолчанию является ключевым   -  person sameera sy    schedule 13.03.2016


Ответы (2)


states — это словарь, поэтому, когда вы вызываете for test in states.items(), он присваивает каждому элементу словаря (tuple) значение test.

Затем вы просто перебираете элементы и печатаете их ключи и значения, как если бы вы использовали for state, abbrev in states.items():.

>>> for state in states.items():
    print (state) # print all the tuples


('California', 'CA')
('Oregan', 'OR')
('Florida', 'FL')
('Michigan', 'MI')
('New York', 'NY')

Все подробности доступны в Интернете, например, в PEP 234 -- Итераторы в разделе Итераторы словаря:

  • #P4#
    for k in dict: ... 
    
    #P5#
    for k in dict.keys(): ... 
    
    #P6#
  • #P7#
    for key in dict.iterkeys(): ...
    
    for value in dict.itervalues(): ...
    
    for key, value in dict.iteritems(): ...
    
    #P8#
person Idos    schedule 13.03.2016
comment
Итак, насколько я понимаю, тест эквивалентен for k в dict, и когда вы выполняете итерацию с оператором печати, у вас должно быть два экземпляра% s, потому что у теста есть и ключ, и значение? - person alfo35x; 13.03.2016
comment
Да, модификатор %s представляет собой одну строку, поэтому он ожидает, что у вас будет 2 из них, поскольку вы пытаетесь напечатать словарную запись, в которой есть ключ и значение :) - person Idos; 13.03.2016
comment
Это здорово, большое спасибо. Сначала я попробовал этот тест просто как способ сломать его, а затем был удивлен, когда он дал мне такой результат. Отличная помощь, всем спасибо! - person alfo35x; 14.03.2016

Это «недостающее звено» между вашим первым и вторым фрагментами кода объясняет, почему они эквивалентны:

print "-"*10
for test in states.items():
    state, abbrev = test
    print "%s has the city %s" % (state, abbrev)
person VPfB    schedule 13.03.2016