从LPTHW故障理解循环练习39

时间:2013-10-27 21:08:34

标签: python python-2.7

我正在努力学习Python The Hard Way,我在练习中遇到某些循环时遇到了一些麻烦,并且找不到信息。

这是代码。

statesAbbrev = {
"Oregon" : "OR",
"Florida" : "FL",
"California" : "CA",
"New York" : "NY",
"Michigan" : "MI",
"Washington" : "WA"
}

statesCities = {
"CA" : "San Francisco",
"MI" : "Detroit",
"FL" : "Jacksonville",
"WA" : "Seattle",
"NY" : "Buffalo"
}

print "-" * 10
for state, abbrev in statesAbbrev.items():  
    print "%s is abbreviated %s" % (state, abbrev)

我根本不理解这个循环。我在看它,它让我的大脑融化。我明白statesAbbrev.items()可能抓住了那个dict中的第一个项目,但是'state'还没有定义,'abbrev'是什么?另外for循环如何调用'something,somethingElse'

请帮助我理解!

您可以在此处找到整个练习和所有代码:http://learnpythonthehardway.org/book/ex39.html

2 个答案:

答案 0 :(得分:5)

欢迎使用Python编程!

stateabbrev由 for循环定义statesAbbrev.items()返回包含字典键和值的元组列表:

[('Oregon', 'OR'), ('Florida', 'FL') ...]

如此有效地循环遍历该列表。

什么

for state, abbrev in ...:

将其称为元组解包:获取N个元素的元组并立即将其分配给N个变量。因此,每次循环时,stateabbrev都会设置为statesAbbrev字典中的一个条目。

希望有所帮助!

编辑:使用元组拆包更有趣

您可以尝试使用尽可能多的值自行解包:

In [1]: a,b,c = 1,2,3

In [2]: a
Out[2]: 1

In [3]: b
Out[3]: 2

In [4]: c
Out[4]: 3

In [5]: def x(): return (1,2,3,4)

In [6]: d,e,f,g = x()

In [7]: d
Out[7]: 1

In [8]: e
Out[8]: 2

In [9]: f
Out[9]: 3

In [10]: g
Out[10]: 4

但如果你给它的值太少或太多,你就会得到这样的错误:

In [11]: a,b = (1,2,3)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-11-9c07109388c5> in <module>()
----> 1 a,b = (1,2,3)

ValueError: too many values to unpack

In [12]: a,b,c,d,e,f,g = (1,2,3)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-12-fcc71a498285> in <module>()
----> 1 a,b,c,d,e,f,g = (1,2,3)

ValueError: need more than 3 values to unpack

至于循环:

In [13]: lst = [(1,2,3,4),(5,6,7,8)]

In [14]: for a,b,c,d in lst:
   ....:     print a,b,c,d
   ....:
1 2 3 4
5 6 7 8

mind. blown.

答案 1 :(得分:2)

如果你这样做:

print statesAbbrev.items()

你得到了输出:

[('Washington', 'WA'), ('Michigan', 'MI'), ('Florida', 'FL'), ('Oregon', 'OR'), ('New York', 'NY'), ('California', 'CA')]

这是一个元组列表,其中每个元组都有字典statesAbbrev的密钥作为第一个项目,第一个项目的值作为第二个项目。

现在有问题的循环应该有意义! :)