Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
艰苦学习Python-练习39_Python_Python 2.7_Dictionary_Tuples_Enumeration - Fatal编程技术网

艰苦学习Python-练习39

艰苦学习Python-练习39,python,python-2.7,dictionary,tuples,enumeration,Python,Python 2.7,Dictionary,Tuples,Enumeration,在艰苦学习Python的练习39中,第37到39行如下所示: print "-"*10 for state, abbrev in states.items(): print "%s has the city %s" % (state, abbrev) 我想我明白了。我认为Python是从“states”中获取KEY:VALUE,并将KEY分配给“state”,将VALUE分配给“abbrev” 然而,当我输入以下代码时,我发现发生了一些奇怪的事情: print "-"*10 for t

在艰苦学习Python的练习39中,第37到39行如下所示:

print "-"*10
for state, abbrev in states.items():
    print "%s has the city %s" % (state, abbrev)
我想我明白了。我认为Python是从“states”中获取KEY:VALUE,并将KEY分配给“state”,将VALUE分配给“abbrev”

然而,当我输入以下代码时,我发现发生了一些奇怪的事情:

print "-"*10
for test in states.items():
    print "%s has the city %s" % (test)
它产生与原始代码相同的输出。 但是,只有将
%s
放入print语句中两次,它才会起作用

有人能解释一下“测试”是怎么回事吗? “测试”到底是什么?是元组吗? 它似乎同时包含来自
states.items()
键和

我已经在这里浏览了练习39中的一些其他问题,但没有找到相同的问题

下面列出了代码(对于Python 2.7)


states
是一个字典,因此当您调用
以在states.items()中进行测试时,它会将字典的每个项(一个
元组
)分配给
测试

然后,您只需迭代这些项并打印它们的键和值,就像在state中使用
一样,abbrev in states.items():

所有详细信息均可在线获取,例如在字典迭代器下:

  • 字典实现了一个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(): ...
    
    这意味着dict中x的
    是dict中x的
    的缩写
    dict.iterkeys()

第一个代码段和第二个代码段之间的“缺失链接”解释了为什么它们是等效的:

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

您不必使用states.items(),字典的默认iterable是keySo如果我理解的话,“test”相当于“for k in dict”,当您使用print语句进行迭代时,您必须有两个%s实例,因为“test”既有键也有值?是的,修饰符
%s
是一个字符串,所以它希望您有两个,因为您正在尝试打印一个字典条目,它有一个键和一个值:)太好了,非常感谢。起初,我试过那个“测试”只是为了打破它,但当它给我那个结果时,我很惊讶。帮了大忙,谢谢大家!
for key in dict.iterkeys(): ...

for value in dict.itervalues(): ...

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