优缺点
书的好处是很多新特性提高了可读性代码性等各方面性能,缺点是新特性和py老版本不兼容,老版本可能没有这些新特性,如果用了py早期版本,需要考虑替代方案
查py版本
import sys
sys.version
sys.version_info
遵循PEP8
PEP8,Python Enhancement Proposal #8
章节列了几个点,也可以看原文PEP 8 – Style Guide for Python Code | peps.python.org
导包顺序建议:先导标准库模块,再导三方模块,再导自研模块
pylint是一个py源码静态分析工具,会检查代码是否符合PEP8Pylint - code analysis for Python | www.pylint.org
bytes和str区别
bytes元素是8位无符号,str元素是unicode字符
编码解码有个三明治方法,即让py核心处理unicode,编码和解码放到最开始和最末尾,以此达到目的,也就是说应该让py处理str类型
bytes -> str叫解码,str -> bytes叫编码
bytes和str一些比较,连接操作等会报错,需注意
open文件写入时,w表示支持str,写入bytes会报错,如果希望写入bytes,需要用wb模式。读文件也一样,如果用r读二进制会报错。也可以通过传入encoding编码协议支持w或r操作二进制文件
可以执行import locale;locale.getpreferredencoding()查看当前系统支偏好的编码
用f字符串取代str.format
传统是用%格式化字符串,规则是从C语言继承的,以其为依据。%左边的字符叫格式字符串,在py里这样有几个缺点
1 转换类型不兼容,比如字符串无法和%f %d数值型兼容,需手动检查
2 字符处理和格式字符串会占用较多篇幅
3 若想用同一值填充格式字符串,需要多次传参,当修改时,需要修改多处
4 如果将字典传入格式字符串,会很冗长,因为key和value都要写一遍,还要再格式字符串给每个变量规定名字
解决方案1高级格式字符串
py3添加了高级格式字符串机制,调用内置format函数,不用%号了
{}里可用:分隔,右边写格式说明符
理解:str.format会将每个参数和模式传给format
解决方案2f-string
py3.6添加了f-string
优点:灵活性简洁性达到极致
缺点:py3.6以下不兼容,需考虑替代方案
辅助函数取代表达式
推荐用unpacking到每个变量而不是用下标访问序列
尽量用enumerate取代range
enumerate将可迭代对象封装成惰性生成器,还返回序号。range可用于迭代一系列整数
用zip同时遍历两多个迭代器
zip和enumerate类似,将多个迭代器每次迭代取一个元素返回生成器,内存不会消耗很多
zip遍历时如果迭代器长度不相等,zip只会迭代到元素最短的长度然后停止,如果想zip迭代到最长长度的序列可用itertools.zip_longest方法
for和while后不建议用else
主要是else会较难理解,难理解大过了功能便利
用赋值表达式减少重复代码
赋值表达式也是海象运算符,目的是减少一些临时变量,比如获取一个值然后判断该值,继续后面的逻辑,其实判断结束这个变量就没用了
赋值表达式逻辑为将:=右边运算,结果返回给:=左侧的变量,然后该语句接下来的值就是左边的变量,这种用在if 临时变量时比较合适
当多重if else存在时,或是有switch else结构,可以考虑用海象运算符简化代码结构,也可用于while结构的异常跳出,将还想运算符直接放到while判断跳出的表达式处
总而言之,作用是减少代码行数,提高可读性