Python 之禅是 Python 之父对编程思想的理解,它不仅适用于 Python ,也适用于 C、C++、C#、Java 等各种语言,值得大家玩味和品读。

目录

Python之禅在哪里

Python 之禅听起来像一本书,但它其实就是12句话,内置在 Python 之中。在 Python 交互环境中输入 import this ,就能看到由 Tim Peters 创作的 Python 之禅。

Python 3.7.4 (tags/v3.7.4:e09359112e, Jul  8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
>>>

这12句禅理是什么意思呢?我们一起来品读一下。

禅理一:要美丽,不要丑陋

原文

Beautiful is better than ugly.

代码是给人阅读的,是给机器执行的。机器不关心代码的美丑,但人关心。在代码审查时、软件维护时,代码都会被自己或他人阅读,书写端正的代码让人赏心悦目,反之,书写凌乱的代码让人痛苦不堪。

我们要善于用空行和缩进对代码进行排版,这样的代码看起来段落清晰,层次分明。

代码犹如海边的佳人,要端庄美丽

禅理二:要明了,不要隐晦

原文

Explicit is better than implicit.

什么是明了?明了的代码起码具有以下几个特征:

  • 代码能够做到望文生义,变量名称、函数名称一眼就能看懂和理解;
  • 函数逻辑清晰;
  • 模块之间调用关系明确。

这几个特征同时具备最好,但有时也难以做到。比如很多朋友刚接触设计模式的时候都不习惯,函数的调用关系和日常编程差别很大,很多调用关系确实比较隐晦,如观察者模式。但熟悉之后你会发现,设计模式整体逻辑很清晰、调用关系也很明确,能够解决常规编程难以解决的问题。

下面两段代码的功能是一样的,你认为哪一个明了,哪一个隐晦?

我明了吗?

# 返回两个数中较大的一个
def Max(num1,num2):
  if (num1 < num2):
    return num2;
  else:
    return num1;

if __name__ == '__main__':
  maxValue = Max(3,4)
  print(maxValue)

我隐晦吗?

def a(m0,m1):
  if (m0<m1):
    return m1;
  else:
    return m0;

if __name__ == '__main__':
  x=a(3,4)
  print(x)

禅理三:要简单,不要复杂,更不要凌乱

原文

Simple is better than complex. Complex is better than complicated.

解决问题的方法有很多,把复杂的问题简单化,用简单的代码解决问题是最理想的。如果问题确实太复杂,难以简化,那也要努力在代码层面让对象之间的关系清晰明确,同时要采用技术手段减少对象之间的耦合,否则就如整理凌乱的电缆线一样,终会在某一天让你涌上放弃维护代码的冲动。

禅理四:要扁平,不要嵌套

原文

Flat is better than nested.

扁平代码与嵌套代码相比易读、易理解。所以在能够使代码扁平化的时候就不要嵌套。

下面是一个程序的两个版本,用于提取一组数据中的偶数。一个是嵌套版本,一个是扁平版本,读者可以感受一下哪一个版本更舒服。

嵌套版本

# 提取数据集合中的偶数 (嵌套版本)

input_numbers = [1,2,3,4,5,6,7,8]
even_numbers = []

for number in input_numbers:
  if number%2 == 0:
    even_numbers.append(number)

print(even_numbers)

运行结果

[2, 4, 6, 8]

扁平版本

# 提取数据集合中的偶数 (扁平版本)

input_numbers = [1,2,3,4,5,6,7,8]
even_numbers = []

even_numbers = [number for number in input_numbers if number%2== 0]

print(even_numbers)

运行结果

[2, 4, 6, 8]

禅理五:要疏松,不要紧凑

原文

Sparse is better than dense.

写代码和写文章是一样的,需要段落分明,长短句搭配。那种一口气到底,中间除了逗号还是逗号的文章看起来就不太爽。写代码的时候通过空行将代码的逻辑分段,看起来舒服,也能反映编程人员的逻辑是否清晰。

下面是一个程序的两个版本,一个紧凑型,一个疏松型,请读者体会一下。

紧凑版本

import os
import time

def main():
  text = 'Python之禅......'
  while True:
    # 清理屏幕上的输出
    os.system('cls')
    print(text)
    # 休眠200毫秒
    time.sleep(0.2)
    text = text[1:] + text[0]

if __name__ == '__main__':
  main()

疏松版本

import os
import time

def main():
  text = 'Python之禅......'

  while True:
    # 清理屏幕上的输出
    os.system('cls')

    print(text)

    # 休眠200毫秒
    time.sleep(0.2)

    text = text[1:] + text[0]

if __name__ == '__main__':
  main()

禅理六:要可读,不要惜字如金

原文

Readability counts.

从可读性的角度来看,变量名称和函数名称尽可能清晰,如果能够用全名就不要用缩写,比如 strCpystrCopy 相比,哪个更容易理解呢?strCpy 是1970年的产物,那时候的计算机资源有限,现在的编程人员还会为内存大小、磁盘大小苦恼吗?

注释也是增加可读性的重要手段,重要的变量、函数的功能和参数都应该用注释进行说明。没有注释的代码很可能最终让自己掉进坑里,毕竟以后的维护工作大概率还是自己来弄。

现代程序越来越复杂,可读性比节约几个字母更有价值。

禅理七:要遵守规则,不要随意特殊

原文

Special cases aren’t special enough to break the rules. Although practicality beats purity.

这个世界是矛盾的,也是辩证的。

遵守规则有一定的成本,但回报也极大。打破规则能在短时间提高效率,但极有可能带来可读性差、混乱、难以理解和维护的代码。如果你觉得打破规则很刺激,也请先忍耐一下,先按照规则来,等能够熟练地遵守规则后再考虑打破它,也许到那时你已经很享受规则带来的好处了,不是吗?

禅理八:要抛出并捕获异常,不要悄悄放行

原文

Errors should never pass silently. Unless explicitly silenced.

程序执行时难免遇到错误,比如输入超界或分母为0,此时如果不抛出这些异常,调用方会一头雾水,不知道问题出在哪里。如果程序正确抛出了异常,但调用方不去捕获,后续的执行可能会进入失控状态。异常不会因为我们不去捕获就消失了,如果那样的话,对码农来说该是多么幸福。

禅理九:要找准方向,不要盲目猜测

原文

In the face of ambiguity, refuse the temptation to guess. There should be one– and preferably only one –obvious way to do it. Although that way may not be obvious at first unless you’re Dutch.

在你尝试修复bug时,在你准备实现一个功能时,可能面临多个选择。这个时候应该慢一点,从逻辑上分析清楚哪个选择是有道理的,不要盲目去尝试。因为在这多个选择中,有可能而且极有可能只有一个是对的。所以这个时候不能太激动,没有分析作为依据的尝试会浪费掉宝贵时间

你曾经有过关闭计算器再重启,然后发现某个奇怪的问题消失的经历吗?有些人可能有过,但他们发现这个奇怪的问题并没有离开,它还会在某个时间突然蹦出来。所以必须要分析,计算机程序是一个逻辑的世界,不能从逻辑上说清楚的解决办法都难以让人放心。

禅理十:要积极去做,不要无准备就开干

原文

Now is better than never. Although never is often better than right now.

做肯定要比不做强,但还没准备好就去做也并非是一件好事。

在开始编码之前,需要进行概要设计、详细设计、测试用例设计等准备工作,准备好之后就可以开始编码了。准备工作不可能尽善尽美,如果要等到一切都准备“完美”之后再开始编码,是不现实的。但也不提倡没有任何准备就开始大干快上的编码,哪怕这些准备仅仅是在稿纸上勾画的图形。

禅理十一:要说的明白,不要难于言表

原文

If the implementation is hard to explain, it’s a bad idea. If the implementation is easy to explain, it may be a good idea.

如果代码很难对其他人解释清楚,那么这肯定不是一个好代码。就像我们去听一个演讲,听完之后感觉云里雾里,不知道演讲者说的是什么,你会给这个讲演的人转发评论点赞吗?

反过来,如果代码很容易对其他人解释清楚,那么这很有可能是一个好代码,当然也有可能是一个不好的代码。

开发软件真的容易吗?不,开发软件是一个艺术创造的过程,是一件辛苦的工作。米开朗基罗用的是凿子和斧头,码农用的是键盘和鼠标,他们的共同点是都在创造艺术品。

禅理十二:要善用命名空间,不要拒绝

原文

Namespaces are one honking great idea – let’s do more of those!

命名空间用于解决一个模块中的名称与另一个模块中的名称冲突,在 Python 世界中,它是模块化设计的重要支撑。

下面是一个命名空间的示例,这里有两个函数,名称一样,功能不一样,通过命名空间我们将它们分隔开,并在主程序中调用。

module1.py

def say():
    print('早安, 武汉!')  # 写于武汉经历磨难之时,加油武汉!

module2.py

def say():
    print('晚安, 武汉!')  # 写于武汉经历磨难之时,加油武汉!

main.py

import module1 as m1
import module2 as m2

m1.say()
m2.say()
print('爱你,我们的武汉!') 

运行结果

早安, 武汉!
晚安, 武汉!
爱你,我们的武汉!


相关博客文章

相关书籍教程文章
官方公众号

💯本站文章同步发表在官方公众号 ReadingHere,关注公众号您将在第一时间了解本站最新文章和资讯。

❤️欢迎您关注本站官方公众号 ReadingHere


版权声明

本文由ReadingHere原创,未经ReadingHere授权不得转载、摘编。已经授权使用的,应在授权范围内使用,并注明来源: www.readinghere.com。违反上述声明者,ReadingHere将追究其相关法律责任。


交流合作

如需交流咨询或商务合作请扫描下图微信二维码联系。