用pythonic方式来思考(1)
先 print 一下 Zen of Python,让我们学会如何离 pythonic 更近:
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!
第1条: 确认自己所用的 Python 版本
如果电脑里面同时安装了 python2 和 python3 的话,通常我们用 python
来运行 python2 的版本, 用 python3
来运行 python3 的版本。
查看电脑已安装的 python 版本时,可以使用 python --version
或者 python3 --version
来获取当前的版本号。
也可以通过内置的 sys
模块来查询。
>>> import sys
>>> print(sys.version_info)
sys.version_info(major=3, minor=6, micro=4, releaselevel='final', serial=0)
>>> print(sys.version)
3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)]
由于 Python 核心团队计划在 2020 年停止支持 Python 2,最好还是学习 python3。
第一条建议应该就是让我们学会查看自己当前使用的 python 版本并推荐使用 python3。
第2条:遵循 PEP 8 风格指南
- 使用 space 来缩进,而不是直接用 tab。
- 语法相关的每个缩进都用 4 个空格来表示。
- 每行的字符数不超过 79。(现在 pycharm 编辑器中字符数推荐是不超过121)
- 表达式过长,分行时首行之外的其余行需要缩进4个空格。
- 同一文件中函数与函数之间,函数与类之间,类与类之间,隔开两个空行。
- 下标获取元素,调用函数和给关键字参数赋值时,“=”号两边加不需要加空格。
- 变量赋值需要在两侧各加一个空格。
- 函数、变量以及属性使用小写字母拼写,各单词之间加下划线。如 do_something()。
- 类与异常使用首字母大写拼写。如 ClassExcept()。
- 受保护的实例属性,单个下划线开头。如 _protected_instance。
- 私有实例属性,双下划线开头。如 __private_value。
- 模块级别常量,全部使用大写字母表示。如MAX_LEN。
- 类中实例方法,首个参数为 self, 表示对象自身。
- 类方法,首个参数为cls。
- 采用内联方式的否定,不要把否定否定整个表达式的前面。
- 不要通过检测长度的方法来判断 somelist 如字符串、列表、字典等是否为空,应该采用 if not 。
- 检测 somelist 非空时,同理,使用 if somelist。
- 不要编写单行的 if语句、for循环、while循环以及except复合语句。
- import 语句总应该放在文件开头。
- 引入模块时,总是应该使用绝对名称,而不是根据当前模块路径来使用相对名称。
- 如果一定要使用相对名称来编写 import 语句,采用明确的写法:from.import foo
- 文件中 import 语句应该按顺序划分为三个部分,分别表示为标准库模块,第三方模块以及自用模块。在每一部分之中,按模块的字母顺序来排列。
第3条:了解 bytes、str 与 unicode的区别
python3 有两种表示字符序列的类型:bytes 和 str。bytes实例是原始的8位值,str实例包含Unicode字符。
python2 也有两种字符序列的类型:str 和 unicode。str实例包含原始的8位值,unicode实例包含unicode字符。
在python2 和 python3 中,我们可以编写函数来实现输入是 str 或者 unicode 总是返回 str 或者 unicode 的一种的方法。
在 python3 中,
总是返回 str:
def to_str(chara_seq):
if isinstance(chara_seq, bytes):
value = chara_seq.decode('utf8')
else:
value = chara_seq
总是返回 bytes:
def to_bytes(chara_seq):
if isinstance(chara_seq, str):
value = chara_seq.encode('utf-8')
else:
value = chara_seq
在 python2 中,
总是返回unicode:
def to_unicode(chara_seq):
if isinstance(chara_seq, str):
value = chara_seq.decode('utf-8')
else:
value = chara_seq
总是返回 str:
def to_str(chara_seq):
if isinstance(chara_seq, unicode):
value = chara_seq.encode('utf-8')
else:
value = chara_seq
注意: python3使用打开文件的open()函数时,默认使用utf8,以'rb'或'wb'来进行文件的读操作和写操作。
第4条:用辅助函数来取代复杂的表达式
表达式如果变得比较复杂,应该考虑将其拆解成小块,并把逻辑移入辅助函数中。
比如从一个字典中获取一个值的判断,有可能写成:
foo_dict.get(key)
当字典中无法获取到给定的 key 时,即返回 None,希望返回一个默认值,可以写成:
value = foo_dict.get(key) or default_value
这样就可以实现在字典中获取不到指定 key 时,得到自己设置的默认值。
如果需要字典中取出的值时 int 型,则改为:
value = int(foo_dict.get(key)) or default_value
如果使用简洁易懂的 if/else 表达式,可以写成:
value = foo_dict.get(key)
value = int(value) if value else default_value
但是如果频繁使用这种逻辑,更好的方式是做成辅助函数的方式,
def get_int(foo_dict, key, default=0):
value = foo_dict.get(key)
if value:
result = int(value)
else:
result = default
return result