effictive-python第一章笔记

第一章 用Pythonic方式来思考
1、确认自己所用的python版本(python3)
两个主流的python版本:python2(2020年就不维护) python3(推荐)
多种流行的python运行时环境 CPython(默认), Jython(java)
IronPython,PyPy(JIT,python2效果显著,python3基本无效果)
2、遵循PEP8风格指南
PEP8列出很多细节,以描述如何撰写清晰的python代码。
空白
使用空格表示缩进,不适用tab制表符
和语法相关的每一层缩进用4个空格表示
每行字符数不应超过79
占据多行的长表达式,除了首行之外的,其余行需要再之前的级别上再加4个空格
文件中函数与类之间应该用两个空行隔开
同一个类中,个方法之间应该用一个空行隔开
使用下表获取列表元素,调用函数或给关键字参数赋值的时候,不要再两边加空格。
a[0]
未变量赋值的时候,左右两侧应该加上空格,而且只写一个就好
a = b
命名
函数、变量及属性应该用小写字母来拼写,单词之间用下划线连接
def test_a(), my_name, self.my_name
受保护的实例属性,应该以单个下划线开头
self._leading_underscore
私有的实例属性,应该以两个下划线开头
self.__double_leading_underscore
类与异常,每个单词首字母均大写的格式
CapitalizedWord
模块级别的常量,全部大写
ALL_CAPS
类中的实例方法,应该把首个参数命名为self,表示对象自己
类方法的首个参数应该命名为cls,表示类自己
表达式与语句
采用内联形式的否定词,if a is not b而不是if not a is b
不要通过检测长度的方法来判断列表是否为空,if not somelist而不是if len(somelist) == 0
检测somelist是否为[1]或“hi”等非空值时,也应如此.
不要编写单行的if语句、for循环、while循环及except复合语句,而应该把这些语句分成多行来书写
import语句应该总是放在文件开头
引入模块的时候,使用绝对路径而不是相对路径
如果一定要以相对路径来写import语句,应采用 from . import foo
文件中那些import语句应该按顺序分成三个部分。分别表示标准库模块,第三方模块,自用模块
import sys

import requests

import myself
3、了解bytes、str与unicode的区别
python3 有两种字符序列类型 bytes和str,前者包含原始的8位值
后者包含unicode
python3 str和unicode,str包含原始的8位值,unicode包含unicode
把unicode转为二进制文件有很多种方法,常见的是设置编码方式为utf-8。
unicode转二进制 encode
二进制转unicode decode
编写python程序的时候,编码和解码放到界面最外围,核心部分使用unicode字符类型。
有两个问题要注意
一、python2中,如果str包含7个ascii那么unicode和str似乎成了同一个类型。
在只处理ascii情境下,如果某函数接受str,那么可以传入unicode,如果接受unicode,也可以传入str。而在python3中bytes和str不等价。
二、如果使用内置open函数获取文件句柄.python3默认使用utf-8
,python3默认是二进制。可以将模式改为wb适配
4、用辅助函数来取代复杂的表达式
如果表达式变得复杂,可以将其拆解成小块,移入辅助函数。
5、了解切割序列的办法
对原列表进行切割之后,会产生新的列表,修改新列表不会影响原列表
对list赋值的时候,如果使用切片操作,就会把原列表中处于相关范围内的值替换成新值。长度不同也可以替换。
6、单词切片操作内,不要同时指定start、end、和stride
如果stride为负数,可以考虑将其拆解成两条赋值语句。一条做范围切割,一个做步进切割。或者使用内置itertools模块的islice
7、使用列表推到来取代map和filter(字典和集合也支持)
代码更加清晰
8、不要使用超过两个以上的表达式的列表推导
9、用生成器表达式来改写数据量较大的里列表推导
将中括号改为小括号即可将列表推导改为生成器
数据量太大,列表推到会因为占用太多内存出问题。
10、尽量用enumerate取代range
enumerate可以将迭代器包装为生成器,返回索引和元素。
11、用zip函数同时遍历两个迭代器
python2中zip不是生成器,如果列表太大也会有内存问题
python3中zip相当于生成器
如果两个迭代器长度不通过,会表现出奇怪的行为。
遍历到长度最小的迭代器。
itertools内置模块中的zip_longest函数可以平行的遍历多个迭代器,不用在乎长度是否相等
12、不要在for和while循环后面写else块
13、合理利用try\except\else\finally结构中的每个代码块
else块可以用来缩减try中代码量,把没有发生异常时索要执行的语句与try/except代码块分隔开

猜你喜欢

转载自www.cnblogs.com/lgh344902118/p/11297498.html