源码阅读随想

以下文字摘自:笨方法学Python41

这里是我们要讨论的代码:

cities['_find'] = find_city
city_found = cities['_find'](cities, state)

你要记住一个函数也可以作为一个变量,``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. statecity 是...
  2. 作为参数传递给...
  3. 一个函数,位置在...
  4. '_find' 然后寻找,目的地为...
  5. cities 这个位置...
  6. 最后赋值给 city_found.

还有一种方法读它,这回是“由里向外”。

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

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

  1. 从前向后。
  2. 从后向前。
  3. 逆时针方向。

评论:

在阅读《C语言程序设计》时候,也有降到怎么处理复杂表达式的方法,在《The C programming Language》中建议的是此处的第3中方法,不过叫的名字是“由里向外---一左一右”的方法

你可能感兴趣的:(源码阅读随想)