Python“理论” - 构建多功能程序 - 如何规划基本流程
我写过一些小程序,用Python做了一些事情,现在我想挑战一下,做点更复杂的项目。
我上一个项目主要是读取一些文本文件,对每个文件进行正则表达式处理,然后把数据整理成有用的格式,这样我就可以分析我手头的数据。
不过到最后我发现,记住代码的每个部分是怎么处理文本的,变得相当困难,尤其是随着我在修正代码时,代码越来越长。
在我脑海中,我想象我的代码是由一系列小模块组成的——独立的.py文件,我可以把它们放在一边,知道它们的功能和如何互相配合。
教我如何定义函数的同事,让我最终写出了一段非常长的代码,我发现很难浏览和调试。
(1) 这样做对吗?还是有更简单的方法来制作模块,让它们之间传递变量?我觉得这样会更好,因为我能更清楚地想象数据流动的过程(主要是因为几年前我在MATLAB中习惯了这样工作)。
(2) 能否在开始之前用这种方法规划出各种函数的层次,以便给自己一个“地图”,让写代码时更有方向?
(3) 有没有简单易懂的教程可以学习这些内容?我常常发现教程的内容突然变得很复杂,让我很难跟上……
谢谢。
3 个回答
要回答你的问题,其实很难知道从哪里开始,因为没有你的代码片段作为参考。你可以考虑把你的代码放到一些免费的公共网站,比如 http://www.bitbucket.org/ 或者 http://www.github.org/,然后附上关于代码小片段的具体问题,并链接到你的代码库。这样这里的回答者就可以查看你的代码并给出意见。(这两个网站都有代码高亮功能,有兴趣的人甚至可以下载你的代码,进行修改,然后上传补丁,或者创建你代码的一个分支,发送“拉取请求”,这样你就可以查看差异并选择性地将更改合并到你的分支中)。
更一般来说,程序设计有很多种方法。你似乎在尝试重新发明一种很古老的方法,叫做“功能分解”——把整体任务看作一个功能(比如处理文本文件),然后考虑这个功能是如何分解成更小的功能(比如读取输入文件、解析文件、准备结果、输出结果),再进一步分解,直到你得到的小单元可以在你的编程环境(比如Python)中轻松编码。
现代的方法(和工具)通常使用面向对象的设计方法。你可以试着阅读一下这个链接: http://www.itmaybeahack.com/homepage/books/oodesign/build-python/html/index.html
其他人建议你可以看看一些有经验的程序员在开源项目中的代码,或者参考一些教程和教科书,这个建议很不错。有时候,一个类似的例子就能帮助你找到正确的方向。
我还建议你把自己的挫折和经验当作反馈,帮助自己进步。每当你有以下这些想法时:
- 感觉我在写的代码几乎都是一样的,只是小改动而已
- 这段代码是我自己写的,但我得花很长时间重新学习它是怎么工作的
- 每次我回去给这段代码添加东西,花的时间越来越长
- 这段代码里有个bug,但我不知道在哪
- 肯定有人解决过这个问题
- 为什么我花这么长时间还没完成?
这说明你的技术还有提升的空间。专家和初学者之间的差别,往往在于能否做到以下几点:
- 不要重复自己(DRY):与其复制粘贴代码,或者写一遍又一遍的相似代码,不如写一个通用的函数,设置一个或多个参数来处理这些事情。然后在多个地方调用这个函数。
- 保持简单(KIS):把你的代码拆分成简单且定义明确的功能/例程,让每个部分都能独立理解,并组织成类/模块/包,这样整体程序就容易理解和维护。写一些简洁明了的注释,记录调用方式,即使你不打算发布它们。
- 分而治之测试:在开发过程中,尽量单独测试每个类、函数等(最好使用单元测试框架),而不是只测试整个应用。
- 不要重新发明轮子:尽量使用开源框架或其他工具来解决一些通用的问题,而不是针对你自己的应用。除非是非常简单的情况,否则你可能对问题的理解不够全面,自制的解决方案可能会有重要的缺陷。
- 诚实估算:回顾自己之前的工作,看看完成某些事情需要多长时间。下次尽量快点,但不要假设自己一定能做到。用自己的经验来估算未来的工作量,设定期望并合理安排工作范围。
(1) 你可以在一个 .py 文件里写出很好的程序。
(2) 不管你用什么编程风格,通常来说(除了某些特殊的硬件情况),把代码分成短小的函数(或方法),每个函数完成一个具体的任务,是最好的做法。
(3) 有经验的程序员常常会先用一种方式写代码,发现问题后,可能会写更多的代码或者换一种写法,并考虑是否可以把已有的代码拆分成单独的函数。如果你发现自己在一个函数里连续给变量赋值以传递数据,这就是一个需要拆分的信号。不要简单地复制粘贴代码到其他地方,即使有改动,除非是把它拆分成一个函数,并用这个函数替代原来的代码。
(4) 在很多情况下,把代码组织成类和对象是有用的,即使在技术上并不“必要”。这样可以帮助你确认是否已经定义了一整套对某些数据集合所需的操作。
(5) 编程其实挺难的。即使是那些有天赋的人,也需要一段时间才能感到得心应手。举个例子,当我在读硕士的时候,我和我的一些(相当有才华的)朋友们都觉得,直到最后一年才开始有了一定的熟练度和能力(这些人从青少年时期就开始编程了)。
重要的是要不断学习和进步,而不是一遍又一遍地重复同一两年的经验。
(6) 为此,多读书和文章。尝试新事物。多思考。