第一章 引论

建议 1:理解 Pythonic 概念

建议 2:编写 Pythonic 代码

建议 3:理解 Python 与 C 语言的不同之处

“缩进”与“{}”

避免缩进带来的困扰的方法之一就是养成良好的习惯,统一缩进风格,不要混用 Tab 键和空格。

‘与“

C 语言中单引号代表一个字符,它实际对应于编译器所采用的字符集中的一个整数值。而双引号则表示字符串,默认以 '\0' 结尾。

三元操作符 ”?:“

C?X:Y 在 Python 中等价的形式为 X if C else Y

switch...case

Python 中可以使用多种方式来实现 switch...case 比如下面这一种:

switch(n) {
  case 0:
    printf("0");
    break;
  case 1:
    printf("1");
    break;
  case 2:
    printf("2");
    break;
  default:
    printf("????");
    break;
}

利用 dict 的 get 方法实现 swith

def f(x):
    return {
      0: "0",
      1: "1",
      2: "2"
    }.get(n, "???")

建议 4:在代码中适当添加注释

建议 5:通过适当添加空行使代码布局更为优雅、合理

建议 6:编写函数的几个原则

原则 1:函数设计要尽量短小,嵌套层次不宜过深。最好能控制在 3 层以内。
原则 2:函数申明应该做到合理、简单、易于使用。参数个数不宜太多。
原则 3:函数参数设计应该考虑向下兼容。比如相同功能的函数不同版本的实现,唯一不同的是在更高级的版本中添加了参数导致程序中函数调用的接口发生了改变。这并不是最佳设计,更好的方法是通过加入默认参数来避免这种退化,做到向下兼容。
原则 4:一个函数只做一件事,尽量保证函数语句粒度的一致性。
原则 5:不要在函数中定义可变对象作为默认值
原则 6:使用异常替换返回错误
原则 7:保证通过单元测试

建议 7:将常量集中到一个文件

Python 的内建命名空间是支持一小部分常量的,例如 True、False、None 等,只是 Python 没有提供定义常量的直接方式而已。

在 Python 中应该如何使用常量?一般来说有以下两种方式:

  • 通过命名风格来提醒使用者该变量代表的意义为常量,如常量名所有字母大写,用下划线连接各个单词
  • 通过自定义的类实现常量功能。这要求符合”命名全部为大写“和”值一旦绑定便不可再修改“这两个条件。下面是一种较为常见的解决办法,它通过对常量对应的值进行修改时或者命名不符合规范时抛出异常来满足以上常量的两个条件。
class _const:
    class ConstError(TypeError):
        pass
    class ConstCaseError(ConstError):
        pass

    def __setattr__(self, name, value):
        if self.__dict__.has_key(name):
            raise self.ConstError, "Can't change const.{}".format(name)
        if not name.isupper():
            raise self.ConstCaseError, "const name {} is not all uppercase".format(name)
        self.__dict__[name] = value

import sys
sys.modules[__name__] = _const()

如果上面的代码对应的模块名为 const,使用时候只需要 import const,便可以直接定义常量了,如以下代码:

import const
const.COMPANY = "IBM"

无论采用哪一种方式来实现常量,都提倡将常量集中到一个文件中,因为这样有利于维护,一旦需要修改常量的值,可以集中统一而不是逐个文件去检查。采用第二种方式实现的常量可以这么做:将存放常量的文件命名为 constant.py ,并在其中定义一系列的常量。

class _const:
    [...]

import sys
sys.modules[__name__] = _const()
import const
const.MY_CONSTANT = 1
const.MY_SECOND_CONSTANT = 2

当在其他模块中引用这些常量时,按照如下方式进行即可:

from constant import const
print(const.MY_SECOND_CONSTANT)