这篇文章是基于《Effective Python——编写高质量Python代码的59个有效方法》[美] 布雷特·斯拉特金 著 爱飞翔 译 这本书中的内容,写写自己在某方面的感悟,并摘录一些作为读书笔记供今后鞭策。侵删。
第 1 条:确认自己所用的Python版本
-
如果你现在想入手Python学习,那么就选择python3。
$ python --version
Python 2.7.8
-
流行的Python运行环境:CPython、Jython、IronPython、PyPy。
memo
第 2 条:遵循PEP 8 风格指南
Python官方关于PEP8的规范
空白
- 使用space来表示缩进,不要使用tab。
- 每行字符数不应该超过79。
- 对于占据多行的长表达式来说,除了首行之外的其余各行都应该在通常的缩进级别上再加4个空格。
- 在同一个类中,各方法之间应该用一个空行隔开。
- 文件中的函数与类之间应该用两个空行隔开。
- 为变量赋值的时候,在等号两边添加一个空格,其余条件下等号两边能不加空格就不要加。
memo
-
python中的空格和tab键不能混用
否则的话则会报类似如下的错误:
IndentationError: unindent does not match any outer indentation level
-
Pycharm中如何设置每行字符个数?
File→Settings→Code Style→ columns
可以看到右侧显示了一条竖线来表示字符范围。
-
如何在pycharm设置pep8外部工具,实现代码的自动排版?
-
安装autopep8
pip install autopep8
-
本文使用的Pycharm版本如下
PyCharm 2019.3.1 (Community Edition)
Build
Runtime version: 11.0.5+10-b520.17 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 10 10.0
GC: ParNew, ConcurrentMarkSweep
Memory: 974M
Cores: 4
Registry:
Non-Bundled Plugins: izhangzhihao.rainbow.brackets
-
File - Settings - Tools - External Tools
上图的内容如下:
Name:autoPep8
Program:autopep8
Arguments: --in-place --aggressive --aggressive $FilePath$
Working directory: $ProjectFileDir$
Output filters: $FILE_PATH$\:$LINE$\:$COLUMN$\:.*
点击OK即可配置成功。
这是未经规范化的代码:
"""
@File : useNewTemplate.py
@Author : jiaming
@Modify Time: 2019/11/29 21:30
@Contact : https://blog.csdn.net/weixin_39541632
@Version : 1.0
@Desciption : None
"""
import os
import randomimport pysnooperclass Tree(object):"""xxx."""def __init__(self, left,right):"""构造函数:param left: 左节点:param right: 右节点"""self.left = leftself.right=rightpassdef print_array(self):pass@pysnooper.snoop()
def main():"""主函数:return:"""passif __name__ == "__main__":main()
点击完毕autopep8后,我们可以看到如下的效果。
"""
@File : useNewTemplate.py
@Author : jiaming
@Modify Time: 2019/11/29 21:30
@Contact : https://blog.csdn.net/weixin_39541632
@Version : 1.0
@Desciption : None
"""
import os
import randomimport pysnooperclass Tree(object):"""xxx."""def __init__(self, left, right):"""构造函数:param left: 左节点:param right: 右节点"""self.left = leftself.right = rightpassdef print_array(self):pass@pysnooper.snoop()
def main():"""主函数:return:"""passif __name__ == "__main__":main()
命名
- 函数、类属性、变量:小写字母+下划线 (lowercase_underscore)
- 受保护的类属性:以单个下划线开头 (_leading_underscore)
- 私有的类属性:应该以两个下划线开头 (__double_leading_underscore)
- 类与异常:采用驼峰命名法。百度百科:驼峰命名法
- 模块级常量:大写+下划线分隔
- 类中实例方法首个参数:默认为self就好
- 类中的类方法的首个参数:默认为cls就好
表达式语句
-
判断是否为空值或是非空值,不应该采用长度判断法,应该使用条件判断,比如:
>>> l = []
>>> l is None
False
>>> len(l) == 0
True
>>> l.append(1)
>>> l is None
False
可以参考我的这篇博文,探究None和False的区别None和False
-
将单行的if、while、for、except的复合语句拆分成多行完成。
-
import语句总是应该在文件开头
-
引入模块时采用 from…import…as…格式
-
将引入模块按照顺序引入:标准库模块,第三方模块,自用模块。每一部分的模块均按照字母顺序排列。
第 3 条:了解bytes、str与unicode的区别
Python 3有两种表示字符序列的类型:bytes和str。前者的实例包含原始的8位值,后者的实例包含Unicode字符。把Unicode字符表示为二进制数据有许多种方法,最常见的编码方式是UTF-8。
要想把Unicode字符转化成为二进制数据,就必须使用encode方法,要想把二进制数据转换成为Unicode字符,则必须使用decode方法。来看下面这个样例:
>>> s = 'a'.encode()
>>> s
b'a'
>>> type(s)
<class &#39;bytes&#39;>
>>> s &#61; &#39;123&#39;.encode()
>>> s
b&#39;123&#39;
>>> s &#61; &#39;我喜欢Python&#39;.encode()
>>> s
b&#39;\xe6\x88\x91\xe5\x96\x9c\xe6\xac\xa2Python&#39;
>>> s.decode(&#39;UTF-8&#39;)
&#39;我喜欢Python&#39;
在Python 3中编写接受str或bytes&#xff0c;并返回str的方法&#xff1a;
以下是在交互式命令行中运行的结果。
>>> def to_str(bytes_or_str):
... if isinstance(bytes_or_str, bytes):
... value &#61; bytes_or_str.decode(&#39;utf-8&#39;)
... else:
... value &#61; bytes_or_str
... return value
...
在Python 3中编写接受str或bytes&#xff0c;并返回bytes的方法&#xff1a;
以下是在交互式命令行中运行的结果。
>>> def to_bytes(bytes_or_str):
... if isinstance(bytes_or_str, str):
... value &#61; bytes_or_str.encode(&#39;utf-8&#39;)
... else:
... value &#61; bytes_or_str
... return value
...
memo
- 对于操作二进制文件可能出现的问题
在python 3中&#xff0c;如果内置的open函数获取了文件的句柄&#xff0c;那么请注意&#xff0c;该句柄会采用UTF-8编码格式来操作文件。
向文件中写入二进制数据&#xff1a;使用的方式为(‘wb’)而不是(‘w’)。读取数据时采用(‘rb’)而不是(‘r’)
第 4 条&#xff1a;使用辅助函数来代替复杂表达式
一行代码可以有多复杂&#xff1f;
print(&#39;\n&#39;.join([&#39;&#39;.join([(&#39;Love&#39;[(x-y) % len(&#39;Love&#39;)] if ((x*0.05)**2&#43;(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3 <&#61; 0 else &#39; &#39;) for x in range(-30, 30)]) for y in range(30, -30, -1)]))
下图展现了它的结果。代码解释请参考我的这篇博客&#xff1a;心形
针对上述极为复杂的代码我们应该采取使用函数的方式来简化。我们只需要将上面代码中的各个语句拆分出来即可。这会让代码变得更加易读&#xff0c;比原来密集的写法更好。
由于Python短小精悍&#xff0c;功能强大&#xff0c;所以很容易就能够写出非常复杂的表达式&#xff0c;我们要避免这种写法。