在Learn Python The Hard Way的练习39中,第37到39行看起来像这样:
print "-"*10
for state, abbrev in states.items():
print "%s has the city %s" % (state, abbrev)
我认为我理解这一点。我认为Python从“状态”获取KEY:VALUE,并将KEY分配给“state”,将VALUE分配给“abbrev”。
然而,当我输入以下代码时,我发现了一些奇怪的事情:
print "-"*10
for test in states.items():
print "%s has the city %s" % (test)
它产生与原始代码相同的输出。
但是,只有将%s
放入print语句两次才能生效。
有人可以通过“测试”解释发生了什么吗?
究竟是什么“测试”?它是元组吗?
它似乎包含来自KEY
的{{1}}和VALUE
。
我已经在练习39中查看了一些其他问题,但我没有找到相同的查询。
下面列出了代码(适用于Python 2.7)
states.items()
答案 0 :(得分: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')
所有详细信息均可在线获取,例如 Dictionary Iterators 下的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 :(得分:0)
此"缺少链接"在您的第一个和第二个代码段之间解释了为什么它们是等效的:
print "-"*10
for test in states.items():
state, abbrev = test
print "%s has the city %s" % (state, abbrev)