Skip to content

为什么从函数开始?

16 / 44

读完第一部分之后你多多少少已经了一些程序虽然我们总是说,“这就是让你脱盲”;也就是说从此之后你多多少少能够读懂程序这就已经很好了

可是你无论如何都避免不了已经写了一些虽然那所谓的”,不过是而已 —— 但毕竟也是一大步

绝大多数编程书籍并不区分学习者的这两个实际上应该分离的阶段 —— 虽然现实中这两个阶段总是多多少少重叠一部分

在一个比较自然的过程中我们总是先学会阅读而后才开始练习写作并且最终阅读的量一定远远大于写作的量 —— 输入远远大于输出当然貌似也有例外据说香港作家倪匡他自己后来很少读书每天咣当咣当地像是打扫陈年旧物倒垃圾一样写作 —— 他几乎是全球最具产量的畅销小说作家貌似地球另外一端的史蒂芬金都不如他多又当然他的主要输入来自于他早年丰富的人生经历人家读书他阅世所以实际上并不是输入很少恰恰相反是输入太多……

所以正常情况下输入多于输出或者输入远远多于输出不仅是自然现象也是无法改变的规则

于是我在安排内容的时候也刻意如此安排

第一部分主要在于启动读者在编程领域中的阅读能力”,到第二部分才开始逐步启动读者在编程领域中的写作能力”。

在第二部分启动之前有时间有耐心的读者可以多做一件事情

Python 的代码是开源的它的代码仓库在 Github

https://github.com/python/

在这个代码仓库中有一个目录下保存着若干 Python Demo 程序

https://github.com/python/cpython/tree/master/Tools/demo

这个目录下的 README 中有说明

This directory contains a collection of demonstration scripts for various aspects of Python programming.

  • beer.py Well-known programming example: Bottles of beer.
  • eiffel.py Python advanced magic: A metaclass for Eiffel post/preconditions.
  • hanoi.py Well-known programming example: Towers of Hanoi.
  • life.py Curses programming: Simple game-of-life.
  • markov.py Algorithms: Markov chain simulation.
  • mcast.py Network programming: Send and receive UDP multicast packets.
  • queens.py Well-known programming example: N-Queens problem.
  • redemo.py Regular Expressions: GUI script to test regexes.
  • rpython.py Network programming: Small client for remote code execution.
  • rpythond.py Network programming: Small server for remote code execution.
  • sortvisu.py GUI programming: Visualization of different sort algorithms.
  • ss1.py GUI/Application programming: A simple spreadsheet application.
  • vector.py Python basics: A vector class with demonstrating special methods.

最起码把这其中的以下几个程序都精读一下看看自己的理解能力

  • beer.py Well-known programming example: Bottles of beer.
  • eiffel.py Python advanced magic: A metaclass for Eiffel post/preconditions.
  • hanoi.py Well-known programming example: Towers of Hanoi.
  • life.py Curses programming: Simple game-of-life.
  • markov.py Algorithms: Markov chain simulation.
  • queens.py Well-known programming example: N-Queens problem.

就算读不懂也没关系把读不懂的部分标记下来接下来就可以带着问题学习”……

在未来的时间里一个好的习惯就是有空了去读读别人写的代码 —— 理解能力的提高就靠这个了你会发现这事跟其他领域的学习没什么区别你学英语也一样读多了自然就读得快了理解得快了并且在那过程中自然而然地习得了很多句式”,甚至很多说理的方法”、“讲故事的策略”…… 然后就自然而然地会写了从能写一点开始慢慢到很能写”!

为了顺利启动第一部分的阅读”,特意找了个不一样的入口,“布尔运算”;第二部分阅读过渡到写作”,我也同样特意寻找了一个不一样的入口从函数开始写起

从小入手从来都是自学的好方法我们没有想着一上来就写程序而是写子程序”、“小程序”、“短程序”。从结构化编程的角度来看写函数的一个基本要求就是

  • 完成一个功能
  • 只完成一个功能
  • 没有任何错误地只完成一个功能……

然而即便是从小入手任务也没有变得过分简单其中涉及的话题理解起来并不容易尽管我们尽量用最简单的例子涉及的话题有

  • 参数的传递
  • 多参数的传递
  • 匿名函数以及函数的别称
  • 递归函数
  • 函数文档
  • 模块
  • 测试驱动编程
  • 可执行程序

这些都是你未来写自己的工程时所必须仰仗的基础马虎不得疏漏不得

另外这一部分与第一部分有一个刻意不同的编排这一部分的每一章之后没有写总结 —— 那个总结需要读者自己动手完成你需要做的不仅仅是每一个章节的总结整个第二部分读完之后还要做针对整个深入了解函数”(甚至应该包括第一部分已经读过的关于函数的内容的总结…… 并且关于函数这一章并未完全讲完呢第三部分还有生成器迭代器以及装饰器要补充 —— 因为它们多多少少都涉及到下一部分才能深入的内容所以在这一部分就暂时没有涉及

你要习惯归纳总结整理的工作从来都不是一次就能完成的都需要反复多次之后才能彻底完成必须习惯这种流程 —— 而不是像那些从未自学过的人一样对这种东西想当然地全不了解

另外从现代编程方法论来看,“写作部分一上来就从函数入手也的确是更正确因为结构化编程的核心就是拆分任务把任务拆分到不能再拆分为止 —— 什么时候不能再拆分了呢就是当一个函数只完成一个功能的时候……