参考引用于《Effective Python》 Brett Slatkin
1. 确定python版本
importsysprint(sys.version_info) sys.version_info(major=3, minor=6, micro=10, releaselevel='final', serial=0) print(sys.version) 3.6.10|Anaconda, Inc.| (default, Mar252020, 18:53:43) [GCC4.2.1CompatibleClang4.0.1 (tags/RELEASE_401/final)]
2. 编码风格PEP8
- 长度、4空格、不用制表符
- 函数与类—>空两行,函数之间空一行
- 符号之前不加空格,之后加空格
- 命名相关:
- 保护实例属性 _
- 私有实例 __
- 类与异常,首字母大写
- 模块级别的常量,全部大写
- import 基本分为三块,标准库、第三方库、自用库
- self表示实例对象本身,cls表示类本身
3. bytes、str、unicode(再理解)
- Python2包含
str
和unuicode
,可以使用相关的操作符进行比较 - Python3包含
bytes
和str
,属于不同的实例,无法比较
# 这块多思考一下吧,其实两者差别比较大。用的时候也有编码的问题
#python3ifisinstance(xx, bytes): value=xx.decode('utf-8') else: value=xxreturnvalue# 返回str类型ifisinstance(xx, str): value=xx.encode('utf-8') else: value=xxreturnvalue# 返回二进制类型#python2ifisinstance(xx, str): value=xx.decode('utf-8') else: value=xxreturnvalue# 返回unicode类型ifisinstance(xx, unicode): value=xx.encode('utf-8') else: value=xxreturnvalue# 返回str类型
4. 辅助函数代替复杂表达式
- 过长的字符解析,不易理解,使用if/else 或者函数要优于,or、and、boolean
5. 序列的切割(list,str,bytes)
- (sclice)几点注意的写法
- 开始的切片不写0
[0:5]–>[:5]
- 末尾不写len()
[0:len(x)]–>[0:]
- 优势:
- 易于理解:
[-3:-1]
推荐多使用 - 不用担心越界,用于限定最长的长度
[:20]
- 切割的三点特性
- 切割赋予–> deepcopy
- 切割后,改变中间值,不影响切割前后的序列
- deepcopy & copy
### 1.切割赋予后,类似于deepcopyb=a[:4] b[1] =2#a 不变化## 2. 对于切割后,改变中间值,前后不变进行补充a= [1,2,3,4,5,6,7] a[2:4] = [8] print (a) ##[1, 2, 8, 5, 6, 7]## 3. deepcopy & copya= [1,2,3,4,5,6,7] b=ac=a[:] b[0] =2## b = a = [2,2,3,4,5,6,7]c[0] =4## c = [4,2,3,4,5,6,7]
6. 不同时指定(start,end,stride)
- 奇偶索引:
a[::2]
a[1::2]
- 序列反转
a[::-1]
- (对于utf-8字符无效)例如:‘‘谢谢’’
- 同时指定两个输入即可,stride基本使用正数
- 等价于
forxinitertools.islice(c, 10, 13): print(x)
7-9.列表推导
- 列表推导代替map&filter
- 不对两个以上的表达式进行列表推导
- 问题:
- 数据过多时候,对每一个推导的list创建一个列表,耗费过多内存,速度变慢
- 使用生成器进行求值,返回迭代器,使用其他生成器进行读取
# 每一行得到的数据长度都已经保存在内存中了v= [len(x) forxinopen('1.txt')] print(v) [22,1,...........90] #用迭代器进行保存和读取it=len(x) forxinopen('1.txt') #此时it是一个generatorans= ((x,x**0.5) forxinit) #使用ans进行输出
10、用enumerate 取代 range
- 使用的很熟了
11、用zip遍历两个迭代器
- python2可能导致内存问题,因为产生的值一次性都汇聚为元组,慎用。Python3是生成器,逐渐生成
- 长度取最短
/
#构造字典stu=dict(zip(names, scores))
12、不用for/while else
- 若不执行循环,执行else
- 若判断的为空==》不执行循环
13、try\except\else\finally
- else的作用,尽可能缩减try中的代码