我自己写Python已经四五年了,我一直在用我的“强迫症”来维持我的代码质量。 不得不去Google的Python代码规范,简单记一下这几年的工作经历。 如果你也在学pythpn,那你就要学python了。 我希望这篇文章对你有用。
1.首先
建议1.理解Pythonic的概念——详见Python之《Zen of Python》
建议2. 编写Pythonic代码
(1) 避免不规范的代码,比如只用大小写区分变量,使用容易混淆的变量名,害怕变量名太长等。有时候长变量名反而让代码更易读。
(2) 深入学习Python相关知识,如语言特性、库特性等,如Python的演进过程等。深入学习一两个业界公认的Pythonic代码库,如如烧瓶等
建议3:理解Python和C的区别,比如缩进和{},单引号和双引号,三元运算符? , Switch-Case 语句等
建议四:在代码中适当添加注释
建议五:适当加入空行,让代码布局更合理
建议6:编写函数的4条原则
(1) 功能设计尽量短,嵌套层次不要太深
(2)函数声明要合理、简单、易用
(3) 功能参数设计要考虑向后兼容
(4) 一个函数只做一件事,尽量保证函数粒度的一致性
建议七:将常量集中在一个文件中,常量名尽可能全部使用大写字母
2. 编程习语
建议8:使用assert语句发现问题,但要注意断言assert会影响效率
建议九:交换值时不建议使用临时变量,直接a,b = b,a
建议10:充分利用惰性求值(Lazy evaluation)的特性eval()函数的作用是什么?python,避免不必要的计算
建议11:了解枚举的替代实现的陷阱(枚举功能已添加到最新版本的Python中)
建议十二:不建议使用type进行类型检查,因为有时候type的结果不一定可靠。如果有需求,建议改用isinstance函数
建议13:做除法前尽量把变量转成浮点型(Python3以后不用考虑)
建议14:警惕eval()函数中的安全漏洞,有点类似于SQL注入
建议 15:使用 enumerate() 获取序列迭代的索引和值
建议16:区分==和is的适用场景,尤其是比较字符串等不可变类型变量时(详见注释)
建议17:尽可能使用Unicode。Python2编码很头疼,Python3不用想太多
建议18:构建合理的包层次结构来管理Modules
3. 基本用法
建议 19:谨慎使用 from…import 语句以防止命名空间污染
建议20:先使用绝对导入来导入模块(相对导入在Python3中已经被移除)
建议21:i+=1不等于++i。 Python中++i前面的加号只表示正数,不是运算
建议22:习惯使用with自动关闭资源eval()函数的作用是什么?python,尤其是文件读写
建议 23:使用 else 子句简化循环(异常处理)
建议 24:遵循异常处理的一些基本原则
(1)注意异常的粒度,try块中尽量少写代码
(2)谨慎使用单独的except语句,或者exceptException语句,但是定位具体的异常
(3)注意异常捕获的顺序,在合适的层级处理异常
(4) 使用更友好的异常信息,遵守异常参数规范
建议 25:避免 finally 中可能出现的陷阱
建议26:深入理解None,正确判断对象是否为空。
建议 27:对于连接字符串,应优先使用 join 函数而不是 + 操作
建议28:格式化字符串时尽量使用.format函数代替%形式
建议 29:区别对待可变和不可变对象,尤其是作为函数参数
建议30:[]、{}和():容器初始化的一致形式。使用列表理解可以让代码更清晰,同时更高效
建议31:函数传递参数,既不是按值也不是按引用,而是按对象或对对象的引用
建议 32:警惕默认参数的潜在问题,尤其是当默认参数是可变对象时
建议 33:谨慎使用函数中的可变长度参数 args 和 kargs
(1) 这种使用过于灵活,导致函数签名不够清晰,可读性差
(2) 如果因为函数参数太多而用变长参数简化函数定义,那么一般可以重构函数
建议34:深入理解str()和repr()的区别
(1)两者的目标不同:str主要是面向客户的,其目的是可读性,返回形式是字符串形式,具有很高的易读性和可读性; 而 repr 是给 Python 解释器或者 Python 开发者使用的,其目的是准确,其返回值代表 Python 解释器内部的定义
(2)在解释器中直接输入变量,默认调用repr函数,print(var)默认调用str函数
(3)repr函数的返回值一般可以使用eval函数还原对象
(4) 两者分别调用对象的内置函数__str__()和__repr__()
建议35:区分staticmethod和classmethod的使用场景
4.图书馆的使用
建议36:掌握字符串的基本用法
建议 37:根据需要选择 sort() 和 sorted() 函数
sort() 就地对列表进行排序,因此无法对元组等不可变类型进行排序。
sorted() 可以在不改变原始变量本身的情况下对任何可迭代类型进行排序。
建议38:使用copy模块深拷贝对象,区分浅拷贝和深拷贝
建议39:使用Counter进行计数统计,Counter是dictionary类的子类,在collections模块中
建议40:深入掌握ConfigParse
建议 41:使用 argparse 模块处理命令行参数
建议 42:使用 pandas 处理大型 CSV 文件
Python本身提供了CSV文件处理模块,并提供了reader和writer等功能。
Pandas可以提供分块、合并处理等,适用于大数据量,更方便二维数据操作。
建议 43:使用 ElementTree 解析 XML
建议 44:了解模块酸洗的利弊
优点:接口简单,全平台通用,支持的数据类型广泛,可扩展性强
缺点:不保证数据操作的原子性,安全问题,不同语言不兼容
建议 45:序列化 JSON 模块的另一种选择:加载和转储操作
建议 46:使用 traceback 获取堆栈信息
建议 47:使用日志记录记录日志信息
建议48:使用线程模块编写多线程程序
建议 49:使用 Queue 模块让多线程编程更安全
5. 设计模式
建议50:使用模块实现单例模式
建议 51:使用 mixin 让程序更灵活
建议 52:使用发布订阅实现松散耦合
建议 53:用状态模式美化你的代码
六、内部机制
建议 54:了解内置对象
建议55:__init__()不是构造函数,理解__new__()和它的区别
建议56:理解变量查找机制,即scope
本地范围
全球范围
嵌套范围
内置范围
建议 57:为什么需要 self 参数
建议 58:了解 MRO(方法解析顺序)和多重继承
建议 59:了解描述符机制
建议 60:区分 __getattr__() 和 __getattribute__() 方法
建议 61:使用更安全的属性
建议 62:掌握元类
建议 63:熟悉 Python 对象协议
建议 64:对中缀语法使用运算符重载
建议 65:熟悉 Python 的迭代器协议
建议 66:熟悉 Python 的生成器
建议 67:基于生成器的协程和 greenlets,了解协程、多线程和多处理之间的区别
建议 68:了解 GIL 的局限性
建议 69:对象管理和垃圾回收
7.使用工具辅助项目开发
建议 70:从 PyPI 安装第三方包
建议 71:使用 pip 和 yolk 安装和管理包
建议 72:做 paster 来创建包
建议 73:了解单元测试的概念
建议 74:为包编写单元测试
建议 75:使用测试驱动开发 (TDD) 来提高代码的可测试性
建议 76:使用 Pylint 检查代码风格
代码风格审查
代码错误检查
查找重复和不合理的代码,便于重构
高度可配置和可定制
支持集成各种IDE和编辑器
能够根据Python代码生成UML图
可结合Jenkins等持续集成工具,支持自动代码审查
建议 77:进行有效的代码审查
建议 78:将包发布到 PyPI
8.性能分析与优化
建议 79:了解代码优化的基础知识
建议 80:使用性能优化工具
建议 81:使用 cProfile 定位性能瓶颈
建议 82:使用 memory_profiler 和 objgraph 分析内存使用情况
建议 83:努力降低算法复杂度
建议 84:掌握循环优化的基本技巧
减少循环内的计算
把显式循环改成隐式循环,当然这样会牺牲代码的可读性
尝试在循环中引用局部变量
专注于内部嵌套循环
建议 85:使用发电机提高效率
建议 86:使用不同的数据结构来优化性能
建议 87:充分利用 set
建议 88:使用多处理模块克服 GIL 缺陷
建议 89:使用线程池提高效率
建议 90:使用 Cythonb 编写扩展模块
结尾
送书
点击下方卡片,关注“web前端营”,回复529506即可下载
点开“在看”的人都变美了