1、pep8
规范
- 代码编排: 缩进4个字节,行长 80
- 函数间 /函数内/文件结尾 空行
- 单行不要import导入多个库,模块内用不到的不要import
- 注释
- 函数和类尽可能添加
__doc__
- 引入外来算法或者配置时需在注释中添加源链接,表明出处
- 单行注释,块注释
- 函数和类尽可能添加
- 命名
- 包名 、模块名、函数名、方法名全部使用小写,用下划线连起来
- 类名、异常名使用
capwords
的方式,异常名结尾加Error或Wraning
后缀 - 全局变量尽量使用大写,一组同类型的全局变量要加上统一前缀。
- 常量全部使用大写
- 函数名必须有动词如do_something的局势
- 自定义的变量名、函数名不要与标准库中的名字冲突
pip install pep8
2、深浅拷贝
-
a = [1, 2, 3] b = [a] * 3 #[ [1,2,3], [1,2,3],[1,2,3]] print(b) c = copy(b) d = deepcopy(b) e = loads(dumps(b,4)) b[1].append(999) #[[1,2,3,999],[1,2,3,999],[1,2,3,999]] 因为[1,2,3]同一个内存地址 c[1].append(999) #[[1,2,3,999,999],[1,2,3,999,999],[1,2,3,999,999]] d[1].append(999) #[[1,2,3,999],[1,2,3,999],[1,2,3,999]] #深拷贝 所有跟上面的不是同一个,但他们内部用的时同一个 e[1].append(999) #[[1,2,3,999],[1,2,3,999],[1,2,3,999]] #序列化存到文件中,取出来类似于深拷贝 # 所有跟上面的不是同一个,但他们内部用的时同一个
-
对于不可变对象来说不存在深复制一说,都是浅复制。
-
浅拷贝(copy()):拷贝父对象,不会拷贝对象的内部的子对象,子对象只是引用计数增加
深拷贝(
copy.deepcopy()
):完全拷贝父对象跟子对象对于单层的可变对象来说它两都一样,如果可变对象内层嵌套了可变对象,浅拷贝只复制最外层,开辟内存空间,引用内层的,深拷贝全部复制,开辟内存空间。
3、迭代器,生成器
-
可以直接for-in 循环的数据类型都被称为可迭代对象(
iterable
)list、set、tuple、dict 、string
是可迭代对象,不是迭代器l2=iter(list1)
将可迭代对象转换为迭代器 -
iterator:任何实现了
__iter__
和__next__
方法的对象都是迭代器__iter__
返回迭代器自身__next__
返回容器的下一个值- 如果容器中没有更多元素,则会抛出
Stoplterration
异常
-
generator
:这种一边循环一边计算的机制,称为生成器,生成器其实是一种特殊的迭代器,不需要自定义__iter__
和__next__
- 生成器函数(使用了yield),遇到yield时函数会暂停保存当前的所有运行信息,并在下一次执行
__next_-
方法时从当前位置运行 - 生
- 生成器函数(使用了yield),遇到yield时函数会暂停保存当前的所有运行信息,并在下一次执行