2016-03-13 4 views
1

В упражнении 39 Learn Python The Hard Way, строки 37 до 39 выглядеть следующим образом:Learn Python The Hard Way - Упражнение 39

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

Я думал, что я понял это. Я думал, что Python берет ключ: VALUE из «состояний» и назначает KEY «state», а VALUE - «abbrev».

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

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) 
+0

вы не должны использовать states.items(), словаря итерацию по умолчанию есть ключ –

ответ

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 -- Iterators под словарь итераторы:

  • Словари реализуют слот tp_iter, который возвращает эффективный итератор, который выполняет итерации по клавишам словаря. [...] Это означает, что мы можем написать

    for k in dict: ... 
    

    что эквивалентно, но гораздо быстрее, чем

    for k in dict.keys(): ... 
    

    до тех пор, как ограничение на модификации в словаре (либо с помощью петли или другим потоком) не нарушаются.

  • Добавить методы словарей, которые возвращают различные виды итераторов явно:

    for key in dict.iterkeys(): ... 
    
    for value in dict.itervalues(): ... 
    
    for key, value in dict.iteritems(): ... 
    

    Это означает, что for x in dict представляет собой сокращенную for x in dict.iterkeys().

+1

Большое спасибо! – alfo35x

+0

Итак, если я это понимаю, «тест» эквивалентен «for k in dict», и когда вы выполняете итерацию с помощью инструкции print, у вас должно быть два экземпляра% s, потому что «test» имеет как ключ, так и Значение? – alfo35x

+0

Да, модификатор '% s' является одной строкой, поэтому он ожидает, что у вас будет 2 из них, так как вы пытаетесь напечатать словарный словарь с ключом и значением :) – Idos

0

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

print "-"*10 
for test in states.items(): 
    state, abbrev = test 
    print "%s has the city %s" % (state, abbrev) 
Смежные вопросы