提交 b1bbe89e 编写于 作者: 骆昊的技术专栏's avatar 骆昊的技术专栏

修改了部分文档

上级 601efd95
## PEP 8风格指南 ## PEP 8风格指南
PEP是Python Enhancement Proposal的缩写,通常翻译为“Python增强提案”。每个PEP都是一份为Python社区提供的指导Python往更好的方向发展的技术文档,其中的第8号增提案即PEP 8是针对Python语言编订的代码风格指南。尽管我们可以在保证语法没有问题的前提下随意书写Python代码,但是在实际开发中,采用一致的风格书写出可读性强的代码是每个专业的程序员应该做到的事情,也是每个公司的编程规范中会提出的要求,这些在多人协作开发一个项目(团队开发)的时候显得尤为重要。我们可以从Python官方网站的[PEP 8链接](https://www.python.org/dev/peps/pep-0008/)中找到该文档,下面我们对该文档的关键部分做一个简单的总结。 PEP是Python Enhancement Proposal的缩写,通常翻译为“Python增强提案”。每个PEP都是一份为Python社区提供的指导Python往更好的方向发展的技术文档,其中的第8号增强提案(PEP 8)是针对Python语言编订的代码风格指南。尽管我们可以在保证语法没有问题的前提下随意书写Python代码,但是在实际开发中,采用一致的风格书写出可读性强的代码是每个专业的程序员应该做到的事情,也是每个公司的编程规范中会提出的要求,这些在多人协作开发一个项目(团队开发)的时候显得尤为重要。我们可以从Python官方网站的[PEP 8链接](https://www.python.org/dev/peps/pep-0008/)中找到该文档,下面我们对该文档的关键部分做一个简单的总结。
### 空格的使用 ### 空格的使用
1. **使用空格来表示缩进而不要用制表符(Tab)**这一点对习惯了其他编程语言的人来说简直觉得不可理喻,因为绝大多数的程序员都会用Tab来表示缩进,但是要知道Python并没有像C/C++或Java那样的用花括号来构造一个代码块的语法,在Python中分支和循环结构都使用缩进来表示哪些代码属于同一个级别,鉴于此Python代码对缩进以及缩进宽度的依赖比其他很多语言都强得多。在不同的编辑器中,Tab的宽度可能是2、4或8个字符,甚至是其他更离谱的值,用Tab来表示缩进对Python代码来说可能是一场灾难。 1. <u>使用空格来表示缩进而不要用制表符(Tab)。</u>这一点对习惯了其他编程语言的人来说简直觉得不可理喻,因为绝大多数的程序员都会用Tab来表示缩进,但是要知道Python并没有像C/C++或Java那样的用花括号来构造一个代码块的语法,在Python中分支和循环结构都使用缩进来表示哪些代码属于同一个级别,鉴于此Python代码对缩进以及缩进宽度的依赖比其他很多语言都强得多。在不同的编辑器中,Tab的宽度可能是2、4或8个字符,甚至是其他更离谱的值,用Tab来表示缩进对Python代码来说可能是一场灾难。
2. **和语法相关的每一层缩进都用4个空格来表示。** 2. <u>和语法相关的每一层缩进都用4个空格来表示。</u>
3. **每行的字符数不要超过79个字符,如果表达式因太长而占据了多行,除了首行之外的其余各行都应该在正常的缩进宽度上再加上4个空格。** 3. <u>每行的字符数不要超过79个字符,如果表达式因太长而占据了多行,除了首行之外的其余各行都应该在正常的缩进宽度上再加上4个空格。</u>
4. **函数和类的定义,代码前后都要用两个空行进行分隔。** 4. <u>函数和类的定义,代码前后都要用两个空行进行分隔。</u>
5. **在同一个类中,各个方法之间应该用一个空行进行分隔。** 5. <u>在同一个类中,各个方法之间应该用一个空行进行分隔。</u>
6. **二元运算符的左右两侧应该保留一个空格,而且只要一个空格就好。** 6. <u>二元运算符的左右两侧应该保留一个空格,而且只要一个空格就好。</u>
### 标识符命名 ### 标识符命名
PEP 8倡导用不同的命名风格来命名Python中不同的标识符,以便在阅读代码时能够通过标识符的名称来确定该标识符在Python中扮演了怎样的角色(在这一点上,Python自己的内置模块以及某些第三方模块都做得并不是很好)。 PEP 8倡导用不同的命名风格来命名Python中不同的标识符,以便在阅读代码时能够通过标识符的名称来确定该标识符在Python中扮演了怎样的角色(在这一点上,Python自己的内置模块以及某些第三方模块都做得并不是很好)。
1. **变量、函数和属性应该使用小写字母来拼写,如果有多个单词就使用下划线进行连接。** 1. <u>变量、函数和属性应该使用小写字母来拼写,如果有多个单词就使用下划线进行连接。</u>
2. **类中受保护的实例属性,应该以一个下划线开头。** 2. <u>类中受保护的实例属性,应该以一个下划线开头。</u>
3. **类中私有的实例属性,应该以两个下划线开头。** 3. <u>类中私有的实例属性,应该以两个下划线开头。</u>
4. **类和异常的命名,应该每个单词首字母大写。** 4. <u>类和异常的命名,应该每个单词首字母大写。</u>
5. **模块级别的常量,应该采用全大写字母,如果有多个单词就用下划线进行连接。** 5. <u>模块级别的常量,应该采用全大写字母,如果有多个单词就用下划线进行连接。</u>
6. **类的实例方法,应该把第一个参数命名为`self`以表示对象自身。** 6. <u>类的实例方法,应该把第一个参数命名为`self`以表示对象自身。</u>
7. **类的类方法,应该把第一个参数命名为`cls`以表示该类自身。** 7. <u>类的类方法,应该把第一个参数命名为`cls`以表示该类自身。</u>
### 表达式和语句 ### 表达式和语句
在Python之禅(可以使用`import this`查看)中有这么一句名言:“There should be one-- and preferably only one --obvious way to do it.”,翻译成中文是“做一件事应该有而且最好只有一种确切的做法”,这句话传达的思想在PEP 8中也是无处不在的。 在Python之禅(可以使用`import this`查看)中有这么一句名言:“There should be one-- and preferably only one --obvious way to do it.”,翻译成中文是“做一件事应该有而且最好只有一种确切的做法”,这句话传达的思想在PEP 8中也是无处不在的。
1. **采用内联形式的否定词,而不要把否定词放在整个表达式的前面。**例如`if a is not b`就比`if not a is b`更容易让人理解。 1. <u>采用内联形式的否定词,而不要把否定词放在整个表达式的前面。</u>例如`if a is not b`就比`if not a is b`更容易让人理解。
2. **不要用检查长度的方式来判断字符串、列表等是否为`None`或者没有元素,应该用`if not x`这样的写法来检查它。** 2. 不要用检查长度的方式来判断字符串、列表等是否为`None`或者没有元素,应该用`if not x`这样的写法来检查它。
3. **就算`if`分支、`for`循环、`except`异常捕获等中只有一行代码,也不要将代码和`if`、`for`、`except`等写在一起,分开写才会让代码更清晰。** 3. <u>就算`if`分支、`for`循环、`except`异常捕获等中只有一行代码,也不要将代码和`if``for``except`等写在一起,分开写才会让代码更清晰。</u>
4. **`import`语句总是放在文件开头的地方** 4. <u>`import`语句总是放在文件开头的地方。</u>
5. **引入模块的时候,`from math import sqrt`比`import math`更好。** 5. <u>引入模块的时候,`from math import sqrt``import math`更好。</u>
6. **如果有多个`import`语句,应该将其分为三部分,从上到下分别是Python标准模块、第三方模块和自定义模块,每个部分内部应该按照模块名称的字母表顺序来排列。** 6. <u>如果有多个`import`语句,应该将其分为三部分,从上到下分别是Python标准模块、第三方模块和自定义模块,每个部分内部应该按照模块名称的字母表顺序来排列。</u>
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
1. 让代码既可以被导入又可以被执行。 1. 让代码既可以被导入又可以被执行。
```Python ```Python
if __name__ == '__main__': if __name__ == '__main__':
``` ```
...@@ -12,6 +13,7 @@ ...@@ -12,6 +13,7 @@
2. 用下面的方式判断逻辑“真”或“假”。 2. 用下面的方式判断逻辑“真”或“假”。
```Python ```Python
if x: if x:
if not x: if not x:
``` ```
...@@ -19,6 +21,7 @@ ...@@ -19,6 +21,7 @@
**好**的代码: **好**的代码:
```Python ```Python
name = 'jackfrued' name = 'jackfrued'
fruits = ['apple', 'orange', 'grape'] fruits = ['apple', 'orange', 'grape']
owners = {'1001': '骆昊', '1002': '王大锤'} owners = {'1001': '骆昊', '1002': '王大锤'}
...@@ -29,6 +32,7 @@ ...@@ -29,6 +32,7 @@
**不好**的代码: **不好**的代码:
```Python ```Python
name = 'jackfrued' name = 'jackfrued'
fruits = ['apple', 'orange', 'grape'] fruits = ['apple', 'orange', 'grape']
owners = {'1001': '骆昊', '1002': '王大锤'} owners = {'1001': '骆昊', '1002': '王大锤'}
...@@ -39,6 +43,7 @@ ...@@ -39,6 +43,7 @@
3. 善于使用in运算符。 3. 善于使用in运算符。
```Python ```Python
if x in items: # 包含 if x in items: # 包含
for x in items: # 迭代 for x in items: # 迭代
``` ```
...@@ -46,6 +51,7 @@ ...@@ -46,6 +51,7 @@
**好**的代码: **好**的代码:
```Python ```Python
name = 'Hao LUO' name = 'Hao LUO'
if 'L' in name: if 'L' in name:
print('The name has an L in it.') print('The name has an L in it.')
...@@ -54,6 +60,7 @@ ...@@ -54,6 +60,7 @@
**不好**的代码: **不好**的代码:
```Python ```Python
name = 'Hao LUO' name = 'Hao LUO'
if name.find('L') != -1: if name.find('L') != -1:
print('This name has an L in it!') print('This name has an L in it!')
...@@ -62,6 +69,7 @@ ...@@ -62,6 +69,7 @@
4. 不使用临时变量交换两个值。 4. 不使用临时变量交换两个值。
```Python ```Python
a, b = b, a a, b = b, a
``` ```
...@@ -70,6 +78,7 @@ ...@@ -70,6 +78,7 @@
**好**的代码: **好**的代码:
```Python ```Python
chars = ['j', 'a', 'c', 'k', 'f', 'r', 'u', 'e', 'd'] chars = ['j', 'a', 'c', 'k', 'f', 'r', 'u', 'e', 'd']
name = ''.join(chars) name = ''.join(chars)
print(name) # jackfrued print(name) # jackfrued
...@@ -78,6 +87,7 @@ ...@@ -78,6 +87,7 @@
**不好**的代码: **不好**的代码:
```Python ```Python
chars = ['j', 'a', 'c', 'k', 'f', 'r', 'u', 'e', 'd'] chars = ['j', 'a', 'c', 'k', 'f', 'r', 'u', 'e', 'd']
name = '' name = ''
for char in chars: for char in chars:
...@@ -94,6 +104,7 @@ ...@@ -94,6 +104,7 @@
**好**的代码: **好**的代码:
```Python ```Python
d = {'x': '5'} d = {'x': '5'}
try: try:
value = int(d['x']) value = int(d['x'])
...@@ -105,6 +116,7 @@ ...@@ -105,6 +116,7 @@
**不好**的代码: **不好**的代码:
```Python ```Python
d = {'x': '5'} d = {'x': '5'}
if 'x' in d and isinstance(d['x'], str) \ if 'x' in d and isinstance(d['x'], str) \
and d['x'].isdigit(): and d['x'].isdigit():
...@@ -119,6 +131,7 @@ ...@@ -119,6 +131,7 @@
**好**的代码: **好**的代码:
```Python ```Python
fruits = ['orange', 'grape', 'pitaya', 'blueberry'] fruits = ['orange', 'grape', 'pitaya', 'blueberry']
for index, fruit in enumerate(fruits): for index, fruit in enumerate(fruits):
print(index, ':', fruit) print(index, ':', fruit)
...@@ -127,6 +140,7 @@ ...@@ -127,6 +140,7 @@
**不好**的代码: **不好**的代码:
```Python ```Python
fruits = ['orange', 'grape', 'pitaya', 'blueberry'] fruits = ['orange', 'grape', 'pitaya', 'blueberry']
index = 0 index = 0
for fruit in fruits: for fruit in fruits:
...@@ -139,6 +153,7 @@ ...@@ -139,6 +153,7 @@
**好**的代码: **好**的代码:
```Python ```Python
data = [7, 20, 3, 15, 11] data = [7, 20, 3, 15, 11]
result = [num * 3 for num in data if num > 10] result = [num * 3 for num in data if num > 10]
print(result) # [60, 45, 33] print(result) # [60, 45, 33]
...@@ -147,6 +162,7 @@ ...@@ -147,6 +162,7 @@
**不好**的代码: **不好**的代码:
```Python ```Python
data = [7, 20, 3, 15, 11] data = [7, 20, 3, 15, 11]
result = [] result = []
for i in data: for i in data:
...@@ -160,6 +176,7 @@ ...@@ -160,6 +176,7 @@
**好**的代码: **好**的代码:
```Python ```Python
keys = ['1001', '1002', '1003'] keys = ['1001', '1002', '1003']
values = ['骆昊', '王大锤', '白元芳'] values = ['骆昊', '王大锤', '白元芳']
d = dict(zip(keys, values)) d = dict(zip(keys, values))
...@@ -169,6 +186,7 @@ ...@@ -169,6 +186,7 @@
**不好**的代码: **不好**的代码:
```Python ```Python
keys = ['1001', '1002', '1003'] keys = ['1001', '1002', '1003']
values = ['骆昊', '王大锤', '白元芳'] values = ['骆昊', '王大锤', '白元芳']
d = {} d = {}
......
...@@ -86,8 +86,8 @@ ...@@ -86,8 +86,8 @@
- 函数的作用 - 代码的坏味道 / 用函数封装功能模块 - 函数的作用 - 代码的坏味道 / 用函数封装功能模块
- 定义函数 - def语句 / 函数名 / 参数列表 / return语句 / 调用自定义函数 - 定义函数 - def语句 / 函数名 / 参数列表 / return语句 / 调用自定义函数
- 调用函数 - Python内置函数 / 导入模块和函数 - 调用函数 - Python内置函数 / 导入模块和函数
- 函数的参数 - 默认参数 / 可变参数 / 关键字参数(\*) / 命名关键字参数(\*) - 函数的参数 - 默认参数 / 可变参数 / 关键字参数 / 命名关键字参数
- 函数的返回值 - 没有返回值 / 返回单个值 / 返回多个值(\*) - 函数的返回值 - 没有返回值 / 返回单个值 / 返回多个值
- 作用域问题 - 局部作用域 / 嵌套作用域 / 全局作用域 / 内置作用域 / 和作用域相关的关键字 - 作用域问题 - 局部作用域 / 嵌套作用域 / 全局作用域 / 内置作用域 / 和作用域相关的关键字
- 用模块管理函数 - 模块的概念 / 用自定义模块管理函数 / 命名冲突的时候会怎样(同一个模块和不同的模块) - 用模块管理函数 - 模块的概念 / 用自定义模块管理函数 / 命名冲突的时候会怎样(同一个模块和不同的模块)
...@@ -208,22 +208,40 @@ ...@@ -208,22 +208,40 @@
#### Day41 - [快速上手](./Day41-55/01.快速上手.md) #### Day41 - [快速上手](./Day41-55/01.快速上手.md)
#### Day42 - [深入模型](./Day41-55/02.深入模型.md) #### Day42 - [深入模型](./Day41-55/02.深入模型.md)
#### Day43 - [静态资源和Ajax请求](./Day41-55/03.静态资源和Ajax请求.md) #### Day43 - [静态资源和Ajax请求](./Day41-55/03.静态资源和Ajax请求.md)
#### Day44 - [表单的应用](./Day41-55/04.表单的应用.md) #### Day44 - [表单的应用](./Day41-55/04.表单的应用.md)
#### Day45 - [Cookie和会话](./Day41-55/05.Cookie和会话.md) #### Day45 - [Cookie和会话](./Day41-55/05.Cookie和会话.md)
#### Day46 - [中间件的应用](./Day41-55/06.中间件的应用.md) #### Day46 - [中间件的应用](./Day41-55/06.中间件的应用.md)
#### Day47 - [日志和缓存](./Day41-55/07.日志和缓存.md) #### Day47 - [日志和缓存](./Day41-55/07.日志和缓存.md)
#### Day48 - [文件上传](./Day41-55/08.文件上传.md) #### Day48 - [文件上传](./Day41-55/08.文件上传.md)
#### Day49-50 - [RESTful架构和应用](./Day41-55/09-10.RESTful架构和应用.md) #### Day49-50 - [RESTful架构和应用](./Day41-55/09-10.RESTful架构和应用.md)
#### Day51-55 - [项目实战](./Day41-55/11-15.项目实战.md) #### Day51-55 - [项目实战](./Day41-55/11-15.项目实战.md)
- 项目开发流程和相关工具 - 项目开发流程和相关工具
...@@ -237,18 +255,27 @@ ...@@ -237,18 +255,27 @@
#### Day56 - [安装和入门](./Day56-65/01.安装和入门.md) #### Day56 - [安装和入门](./Day56-65/01.安装和入门.md)
#### Day57 - [模板的使用](./Day56-65/02.模板的使用.md) #### Day57 - [模板的使用](./Day56-65/02.模板的使用.md)
#### Day58 - [表单的处理](./Day56-65/03.表单的处理.md) #### Day58 - [表单的处理](./Day56-65/03.表单的处理.md)
#### Day59 - [数据库操作](./Day56-65/04.数据库操作.md) #### Day59 - [数据库操作](./Day56-65/04.数据库操作.md)
#### Day60 - [项目结构](./Day56-65/05.项目结构.md) #### Day60 - [项目结构](./Day56-65/05.项目结构.md)
#### Day61-65 - [项目实战](./Day56-65/06-10.项目实战.md) #### Day61-65 - [项目实战](./Day56-65/06-10.项目实战.md)
- 性能和测试
- 项目部署
### Day66~75 - [爬虫开发](./Day66-75) ### Day66~75 - [爬虫开发](./Day66-75)
...@@ -304,14 +331,24 @@ ...@@ -304,14 +331,24 @@
#### Day91 - [过程模型和团队开发工具](./Day91-100/过程模型和团队开发工具.md) #### Day91 - [过程模型和团队开发工具](./Day91-100/过程模型和团队开发工具.md)
#### Day92 - [模块分割与单元测试](./Day91-100/模块分割与单元测试.md) #### Day92 - [模块分割与单元测试](./Day91-100/模块分割与单元测试.md)
#### Day93~Day97 - [开发中的常见问题](./Day91-100/开发中的常见问题.md) #### Day93~Day97 - [开发中的常见问题](./Day91-100/开发中的常见问题.md)
#### Day98 - [持续集成](./Day91-100/持续集成.md) #### Day98 - [持续集成](./Day91-100/持续集成.md)
#### Day99 - [项目部署和安全性措施](./Day91-100/项目部署和安全性措施.md) #### Day99 - [项目部署和安全性措施](./Day91-100/项目部署和安全性措施.md)
#### Day100 - [性能测试和性能调优](./Day91-100/性能测试和性能调优.md) #### Day100 - [性能测试和性能调优](./Day91-100/性能测试和性能调优.md)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册