Guido van Rossum发明了Python,并确立了Python的指导原则,他被社区称为仁慈的独裁者(Benevolent Dictator For Life,BDFL)。 Tim Peters把这些原则写成了一段偈语,让我们一句一句来解释。
- 美观优于丑陋。(Beautiful is better than ugly.)这句话的意思是说代码是写给人看的,所以在所有程序中,代码都应该尽可能地好看,表达式语法应该简单,并且语法和风格应前后保持一致。
- 显明胜过隐晦。(Explicit is better than implicit.)绝大多数概念应该都是显式的,就像显式的布尔类型。我们直接用文字true和false表示布尔类型,而不需要用数字1和0表示。当然,Python也支持用数字表示布尔类型。而且非零值都可以作为布尔值。类似地,for循环可以处理任何数据结构,不需要考虑变量类型。一个循环语句既可以遍历元组的每个元素,也可以处理字符串的每个字符。
- 简单优于复杂。(Simple is better than complex.)Python的内存管理方式对用户而言很简单,通过垃圾回收器分配/回收内存,避免复杂操作。另一个范例就是简洁的print语句:不仅打印时可以避免使用文件描述符,而且多个对象用逗号隔开就可以自动转换成可以打印的形式。
- 复杂胜过混乱。(Complex is better than complicated.)科学计算的概念都很复杂,但并非程序结构都会十分混乱。即使产品结构十分复杂,Python的程序结构也不应该杂乱无章。Pythonic方式本质上就是简单、简洁,SciPy和NumPy程序包都是非常好的例子。
- 扁平优于嵌套。(Flat is better than nested.)Python标准程序库提供了丰富多样的模块。由于Python的命名空间保持了扁平化结构,因此每个程序库导入名都比较简洁,例如java.net.socket在Python里就是socket。Python标准程序库遵循自备电池(batteriesincluded)的设计哲学。标准程序库提供的模块可以满足各种需求。例如,各种各样的网络协议模块可以用来开发丰富的网络产品。另外,标准程序库里还提供了图形用户界面编程、数据库编程、正则表达式、高精度计算、单元测试等众多模块。标准程序库里的一些模块包括网络(socket、select、SocketServer、BaseHTTPServer、asyncore、asynchat、xmlrpclib和SimpleXMLRPCServer)、互联网协议(urllib、httplib、ftplib、smtpd、smtplib、poplib、imaplib和json)、数据库(anydbm、pickle、shelve、sqlite3和mongodb)、并行处理(subprocess、threading、multipro-cessing和queue)。
- 广泛胜过深邃。(Sparse is better than dense.)这一点是对Python标准程序库的要求,其覆盖面相对广泛浅显,而PyPI(Pythonpackage index,Python程序包索引器)则丰富多彩,博大精深,通过十分详尽的第三方程序包列表,可以为一个主题提供更深入、全面的支持。我们可以用pip安装Python程序包。
- 可读性不可或缺。(Readability counts.)程序的语句块都用空格创建,Python语法中使用最小的标点符号。语句结尾不需要分号。分号可以在句尾使用,但是并非必需。类似地,大多数情况下,表达式也不需要括号。Python使用内联文档产生程序API文档。Python的文档在运行时和线上都可以获取。
- 特例不能破坏规则。(Special cases aren't special enough to break the rules.)这句话隐含的意思是Python中每个成员都是对象。所有内置类型被设计成对象。用于表现数字的数据类型拥有方法。每个函数本身也是拥有方法的对象。
- 即使复杂现实会打破纯粹规则。(Although practicality beats purity.)Python支持多种编程范式,可以让用户选择最适合解决问题的范式。它支持面向对象编程、过程式编程、函数式编程等多种编程范式。
- 异常不能不辞而别。(Errors should never pass silently.)Python的异常处理方法,可以让异常通过较高层面的API编程解决,不需要触及底层API。Python不仅为标准异常的处理提供了非常详细的说明,同时也允许用户自定义异常,进行个性化处理。为了支持代码调试,Python提供了代码跟踪。在Python程序中,错误处理机制默认会在stderr里把完整的错误信息打印出来。跟踪信息里包含源文件名称、行号和源代码,如果存在的话。
- 除非需要它悄然无声。(Unless explicitly silenced.)为了应对一些特殊情况,有时也需要让异常悄无声息地运行。这时,可以使用不带except的try语句。还有一种办法就是把异常转换成普通的字符串。
- 模棱两可时,不要胡思乱想。(In the face of ambiguity, refuse the temptation to guess.)自动类型转换只在事先知晓的情况下才能使用,例如,整型与浮点型数据运算后生成一个浮点型数据。
- 应该有且仅有一种明确的方式解决问题。(There should be one—and preferably only one— obvious way to do it.)这一点是显而易见的。这就需要消除一切冗余。于是程序会变得更容易学习和记忆。
- 虽然那种方式起初并非显而易见,除非你是Guido。(Although that way may not be obvious at first unless you're Dutch.)上一条介绍的处理方式主要是面对标准程序库的。当然,第三方模块非常丰富。例如,Python拥有多个GUI的API,如GTK、wxPython和KDE等。网络编程工具也有很多,如Django、AppEngine和Pyramid等。
- 现在做比不做好。(Now is better than never.)这句话的意思是鼓励用户让Python成为他们最喜欢的工具。Python的ctypes类型,可以让Python程序使用C/C++共享程序库。
- 虽然不做比急于求成好。(Although never is often better than right now.)Python增强方案(Python Enhancement Proposals,PEP)提出了一种缓期执行的方案,对语法、语义和内建类型的改进都会在一段时期后发布的新版本中体现。
- 如果结果很难解释,一定不靠谱;如果容易解释,也许行得通。(If the implementation is hard to explain, it's a bad idea. If theimplementation is easy to explain, it may be a good idea.)在Python里,所有的语法变更、新模块和API的引入,都会经过非常严谨的检查和审批流程。