学习Python艰难的方法 - 练习39

时间:2016-03-13 09:57:49

标签: python python-2.7 dictionary tuples enumeration

在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()

2 个答案:

答案 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 dictfor x in dict.iterkeys()的缩写。

答案 1 :(得分:0)

此"缺少链接"在您的第一个和第二个代码段之间解释了为什么它们是等效的:

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