dict的秘密[摘自笨方法学习python]

##下面这一段函数,没怎么看懂,所以拿出来分析一下
cities = {'CA': 'San Francisco', 'MI': 'Detroit',
'FL': 'Jacksonville'}


cities['NY'] = 'New York'
cities['OR'] = 'Portland'


def find_city(themap, state):
    if state in themap:
        return themap[state]
    else:
        return "Not found."


# ok pay attention!
cities['_find'] = find_city
while True:
    print "State? (ENTER to quit)",
    state = raw_input("> ")
    if not state: break


# this line is the most important ever! study!
city_found = cities['_find'](cities, state)
print city_found
一个函数也可以作为一个变量,‘‘def find_city‘‘ 比如这一句创建了一个你可以在任何地方都能使用的变量。在这段代码里,我们首先把函数find_city 放到叫做cities 的字典中,并将其标记为'_find'。这和我们将州和市关联起来的代码做的事情一样,只不过我们在这里放了一个函数的名称。



好了,所以一旦我们知道find_city 是在字典中_find 的位置,这就意味着我们可以去调用它。第二行代码可以分解成如下步骤:
1. Python 看到city_found = 于是知道了需要创建一个变量。
2. 然后它读到cities ,然后知道了它是一个字典
3. 然后看到了['_find'] ,于是Python 就从索引找到了字典cities 中对应的位置,并且获取了该位置的内容。
4. ['_find'] 这个位置的内容是我们的函数find_city ,所以Python 就知道了这里表示一个函数,于是当它碰到( 就开始了函数调用。
5. cities, state 这两个参数将被传递到函数find_city 中,然后这个函数就被运行了。
6. find_city 接着从cities 中寻找states ,并且返回它找到的内容,如果什么都没找到,就返回一个信息说它什么都没找到。
7. Python find_city 接受返回的信息,最后将该信息赋值给一开始的city_found 这个变量。


我再教你一个小技巧。如果你倒着阅读的话,代码可能会变得更容易理解。让我们来试一下,一样是那
行:
1. state 和city 是...
2. 作为参数传递给...
3. 一个函数,位置在...
4. '_find' 然后寻找,目的地为...
5. cities 这个位置...
6. 最后赋值给city_found.


还有一种方法读它,这回是“由里向外”。
1. 找到表达式的中心位置,此次为['_find'].
2. 逆时针追溯,首先看到的是一个叫cities 的字典,这样就知道了cities 中的_find 元素。
3. 上一步得到一个函数。继续逆时针寻找,看到的是参数。
4. 参数传递给函数后,函数会返回一个值。然后再逆时针寻找。
5. 最后,我们到了city_found = 的赋值位置,并且得到了最终结果。


数十年的编程下来,我在读代码的过程中已经用不到上面的三种方法了。我只要瞟一眼就能知道它的意
思。甚至给我一整页的代码,我也可以一眼瞄出里边的bug 和错误。这样的技能是花了超乎常人的时间和
精力才锻炼得来的。在磨练的过程中,我学会了下面三种读代码的方法,它们是用户几乎所有的编程语言:
1. 从前向后。
2. 从后向前。
3. 逆时针方向。
下次碰到难懂的语句时,你可以试试这三种方法。

你可能感兴趣的:(python,dict)