|
本文分享自华为云社区《不得不知的十个常见PY编码习惯》,作者:码乐。
简介
语言在发展和变化,编码习惯也在发生改变。这里简单聊聊 17个python中常见的编码习惯或者风格。
1,可变数据结构: 注意在函数变量不要使用它
- def foo(x=[]):
- x.append(1)
- print(x)
-
- >>>foo()
- [1]
- >>>foo()
- [1,1]
- >>>foo()
- [1,1,1]
- def foo(p=None):
- if p is None:
- p = []
- p.append(1)
- print(p)
-
- foo()
- [1]
- foo([2,3,4])
- [2,3,4,1]
复制代码 1.1模块的循环导入
我们定义一个老王模块,再定义一个小李模块,相互导入时,将报错- # laowang.py
- import xiaoli
- count =4
- def main():
- wilma.pr('Hello')
- if __name__ == '__main__':
- main()
-
- # xiaoli.py
- import laowang
- def pr(str):
- print(str*fired.count)
- if __name__== '__main__':
- pr("Ok")
复制代码 导入问题,如果在使用其他语言 比如 shell 脚本引用 python代码时,需要将python项目加入 linux环境变量。 >> a = 'gd'>>> b = 'gd'>>> a is bTrue[/code]== 只判断值是否相同- export PYTON_PATH=$PYTHON_PATH:/xxx/xxx/XXXProject
复制代码 2.2 对象引用时python基本构成方式
赋值的本质 a=1,实际上时修改globals()字典的值,局部变量值的修改locals()的访问和修改2.3 引用对象reference count
sys.getrefcount() 查看对象的引用计数,sys.getrefcount()在查看某个引用时将创建一个临时引用,所以引用计数将多1getrefcount© #这里c只有一次引用,但是计数时2,因为当前查询有一次临时引用引用计数的减少和增加getrefcount© # 增加引用d,计数3del d #删除引用d,c的引用计数又重新为2
2.4 垃圾回收机制 garbage collection
垃圾回收时py 独占进行的,大大降低py效率,特定条件下自动启动垃圾回收。
手工回收 gc.collect()
py 运行时分配对象obj allocation 和取消分配对象 deallocation次数被记录,高于垃圾回收阈值,启动垃圾回收
gc.get_threshold()查看该阈值,gc.set)threshold()重新设置该阈值
(700, 10, 10) 700表示启动垃圾回收阈值,10,10表示分别回收的阈值
2.4.1 垃圾回收分代策略 generation,基本假设如下
存活时间越久,越不可能在后面程序中变为垃圾。 这样所有对象分为0,1,2三代,所有新建对象都是0代。某一对象经历垃圾回收,仍然存活,那么它就被归入下一代对象。
垃圾回收时,一定扫描0代对象,如果0代经过一定次数垃圾回收,下一次对0代和1代扫描清理,
当1代也经历一次次数垃圾回收,这启动0,1,2所有对象的扫描
以上gc.get_threshold()返回(700,10,10)两个表示每10次0代垃圾回收,将配置1次1代垃圾回收,每10次1代垃圾回收,才有1次2代垃圾回收。
2.4.2 两个对象相互引用,
相互引用构成引用环 reference cycle,该引用环将给上一节2.4.1的垃圾回收带来困难,
引用环可能构成一些无法使用但引用计数不为0的对象 为了回收该引用环对象,
py复制了每个对象的引用计数为 gc_ref 遍历所有对象,将每个对象引用的对象相应的gc_ref减1,遍历结束后,
gc_ref不为0的对象和这些对象的引用对象,以及继续更新下游引用对象,被爆了,其他对象被回收。
参考 内存管理,函数默认参数,动态类型
2.4.3 迭代
可迭代对象 iter
迭代器 iter + next
生成器 特殊迭代器 yield2.4.4 抽象方法*(函数)
对象方法(self.对象方法),类方法(@classmethod),静态方法(@staticmethod)
抽象方法 需要子类实现的方法 用@abc.abstractmethod以及 metaclass = abc.ABCMeta
使得任何继承自父类的子类必须覆盖实现抽象方法,否则抛出异常
3,其他概念
闭包 closure
闭包指的是 难以读取其他函数内部遍历的函数
实现: 定义在函数内的内部函数可以读取外层函数变量,从而实现闭包
4,惯例
1,判定dict的key是否存在,使用key in dict而不用 has_key
2,not的位置,使用key not in dict 而不用 no key in dict
3, 使用 dict.get(key[,default])如果key存在,返回,否则返回default
4, 数组字典初始化- >>> a = 'gd'
- >>> b = 'gd'
- >>> a is b
- True
复制代码 迭代一个数组,使用for i,e in enumerate(array) 而不是 for i in range(len(array))- a2 = []
- b2 = []
- >>> a2 is b2
- False
- >>> b2 == a2
- True
复制代码 5,py3元组unpack
- first, second,*rest, last = range(10) 0 1 @参数 -x~8 9
复制代码 6, 函数参数传入
foo(**adict) #字典key作为参数名传入参数值7, 字符串连接
8, 解释器中的
9,嵌套列表推导式
- def yd():
- a = 100
- yield a
- yield a*8
- yield 8000
复制代码 10, print重定向
- dic = {}
- for k,v in data:
- group = dic.setdefault(key,[]) #如果存在,返回dic[key],不存在把dic[key]设为defalut并返回
- group.append(v)
- from collections import defaultdic
- dic = defalutdic(list)
- for (k,v) in data:
- dic[key].append(v) #所有key都有一个默认值
复制代码 11,反射
12,Picking是Python数据结构的序列化过程
存储一个对象,稍后再取出读取
如何pickle 已存在的对象类型到文件- first, second,*rest, last = range(10)
- 0 1 2~8 9
复制代码 取出- def foo(x,y):
- print(x,y)
- adict = {'x':1, 'y':2}
复制代码 pickler内建类型和外部方法
类自定义行为Slate 记住它曾经是什么,以及什么时候赋值给它 ?- name = "Wang" "Hone" # WangHong
复制代码 为对象类 提供限制,只能赋予固定的属性名称
13,对象模型Python3和Python2.x之间的主要区别
Python3的string和unicode区别不复存在,因此__unicode__被取消 __bytes__加入进来(与
python2.7的__str__和__unicode__行为类似),用于心的创建字节数组的内建方法
py3默认除法变成了true除法,因此__div__取消
__coerce__被取消,因为与其他魔法方法有功能重复
cmp 取消,与其他魔法方法功能重复
__nonzero__被重命名为
bool14,断点
15, 依赖问题
pycurl 需要contos 7安装python3-devel
具体过程pycurl-centos7
16, py编译 发布流程
1,编译生成pyc文件,建议增加-O优选项
python3 -O -m compileall -b .
2, 删除py文件- [(i,j) for i in range(3) for j in range(i)]
复制代码 3, 删除__pycache__目录- print >>open('a.txt', 'w+'), 'hello,world'
复制代码 4, 打包 tar包- #检查是否某个自定的类
- isinstance(obj, class)
复制代码 5, 或git push到仓库- json = {'name':'jack', 'age':100}
- json_file = open('json pkl', 'rb')
- pickle.dump(json.json_file)
- json_file.dump(json,json_file)
- json_file.close()
复制代码 16 常用内置 魔法函数
iter # 在类中实现,可以直接对类进行迭代 类似于如下形式- data=pickle.load(json_file)
- print(data)
- json_file.close()
复制代码 call # 在对象直接 进行调用- __getinitargs__(self) #
- __getnewargs__(self)
复制代码 、slate 为对象类 提供限制,只能赋予固定的属性名称- 6.1, 断点设置后,代码执行到该位置,程序挂起检查程序行为
- 6.2, 异常断点,到达断点后要执行的操作
- 6.3, 断点属性,达到断点时要执行的操作
- 挂起策略,用于定义在遇到断点时是否必须挂起应用程序
- 对其他断点的依赖,
- 何时必须击中断点
- 6.4 消息记录
- 断点命中消息,命中断点时,控制输出一条日志消息
- 堆栈跟踪 断点的堆栈跟踪将命中打印到控制台
- 6.5 断点工具
- pdb 交互式代码调试,功能包括
- 设置断点,单步调试,进入函数调试,查看当前代码,查看栈片段,动态改变变量的值
- 进入pdb交互界面
- 命令
- break 或b设置断点
- continue 或c 继续执行
- list或l 查看当前代码段
- step或s 进入函数
- return或r 执行代码直到当前函数返回
- exit或q 中止并退出
- next或n 执行下一行
- pp 打印变量的值
复制代码 通过类字典返回函数,不会 返回函数名- find . -name "*.py"|xargs rm -rf
复制代码 查看实例的函数对象- find . -name "__pycache__" |xargs rm -rf
复制代码 17 内置函数 二进制运算
- cd ..
- tar -cjvf xxx.1.1.00.tar.bz2 xxx
复制代码
点击关注,第一时间了解华为云新鲜技术~
来源:https://www.cnblogs.com/huaweiyun/p/17953803
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|