91条改进Python程序的建议

51至官方微

技术信息/行业本质/产品经验

内容源链接

作者:小胡

我自己编写Python已经有四五年了,并且一直保持着我对代码的质量。除了谷歌的Python代码规范,我从未读过类似的书。读完这本书后,看这本书的机会并不坏,所以做一个简单的笔记。如果你有朋友想学习类似的知识,却懒得阅读整本书,你可以参考一下。

1。介绍

建议1,理解Python概念——有关详细信息,请参见Python中的Python禅

建议2。写腐殖码

( 1 )避免使用非标准代码,例如只区分大小写的变量,使用容易混淆的变量名,以及害怕变量名过长等。有时长变量名使代码更容易阅读。

( 2 )深入学习Python相关知识,如语言特性、库特性等。,如Python进化过程等。深入研究一两个业内公认的pythonic代码库,如烧瓶等。

建议3 :了解Python和C之间的差异,例如缩进和{ }、单引号和双引号以及布尔表达式字符?,switch - case语句等。

建议4 :在代码中适当添加注释

建议5 :适当添加空的练习代码布局更合理

建议6 :编写函数的四项原则

( 1 )功能设计应尽可能短,嵌套层次不应太深

( 2 )功能声明应该合理、简单和易于使用

( 3 )功能参数设计应考虑向后兼容性

( 4 )函数只做一件事,并尽可能确保函数粒度的一致性

建议7 :将常量集中在一个文件中,并尝试将所有大写字母用于常量名称

2。编程习惯用法

建议8 :使用Assert语句查找问题,但是注意Assert会影响效率

建议9 :不建议在交换数据值时使用临时变量,而是直接使用A,B = B,A

建议10 :充分利用懒惰评估的特点,避免不必要的计算

建议11 :了解枚举替代实现的缺陷(枚举功能已经添加到最新Python版本中)

建议12 :不建议类型检查,因为有时类型的结果不总是可靠的。如果有需要,建议改用isinstance函数

建议13 :在进行除法之前,尝试将变量转换为浮点类型( Python 3将不会在后面讨论)

建议14 :注意eval ( )函数中的安全漏洞,这有点类似于SQL注入

建议15 :使用Enumerate ( )同时获取序列迭代的索引和值

建议16 :区分= =和IS的适用场景,特别是在比较不变类型变量(如字符串)时(详见注释)

建议17 :尽可能使用Unicode。Python 2中的编码令人头痛,但是Python 3不必想太多

建议18 :构建合理的包级别来管理模块

3 .基本用法

建议19 :节约使用& hellip;防止命名空间污染的导入语句

建议20 :比起导入模块,更喜欢绝对导入( Python 3中删除了相对导入)

建议21 : I + = 1不等于++ I,在Python中,++ I前面的加号仅表示正,而不是操作

建议22 :用于自动关闭资源,特别是在文件读写中

建议23 :使用else子句简化循环(异常处理)

建议24 :遵循一些异常处理的基本原则

( 1 )注意异常的粒度,并在try blocks中编写尽可能少的代码

( 2 )小心使用单独的expert语句或expert语句,但要找到具体的异常

( 3 )注意异常捕获的顺序,并在适当级别处理异常

( 4 )使用更友好的异常信息并遵守异常参数的规范

建议25 :避免最终可能出现的陷阱

建议26 :彻底理解无,并正确判断物体是否为空。Python中的以下数据将被判断为空:

建议27 :连接字符串应该优先于+操作,而不是join函数

建议28 :尝试使用格式化字符串。格式函数,而不是% format

建议29 :区分变量和不可变对象,特别是作为函数参数

建议30 : [ ]、{ }和( ) :一致的容器初始化表单。使用列表解析可以同时使代码更加清晰和高效

建议31 :函数传递参数,不是值或引用,而是对对象或对象的引用

建议32 :注意默认参数的潜在问题,尤其是当默认参数是可变对象时

建议33 :在函数中小心使用可变长度参数args和* k参数

( 1 )这种使用过于灵活,使得函数签名不清晰且不可读

( 2 )如果由于参数太多,函数定义被变长参数简化,那么函数一般可以重构

建议34 :彻底理解STR ( )和REPR ( )之间的区别

( 1 )两者有不同的目标: STR主要面向客户,目的是可读性,返回形式是一种用户友好性和可读性很高的STR形式;repr面向Python解释器或Python开发人员,其目的是准确性,其返回值代表Python解释器内部的定义

( 2 )将变量直接输入解释器,默认情况下调用REPR函数,而PRINT ( VAR )默认情况下调用STR函数

( 3 ) REPR函数的返回值通常可以用EVAL函数恢复

( 4 )两者都调用对象的内置函数STR _ _ ( )和_ _ REPR ( )

建议35 :区分静态方法和类方法使用场景

4 :图书馆

建议36 :掌握字符串的基本用法

建议37 :根据需要选择sort ( )和sort ( )函数

“sort ( )是一种不可变的类型,列表被就地排序,因此元组等不能被排序。

sorted ( )可以在不改变原始变量本身的情况下对任何可迭代类型进行排序。

建议38 :使用拷贝模块制作对象的深度拷贝,区分浅拷贝和深拷贝

建议39 :使用Collections模块中的计数器计数,计数器是字典类的子类

建议40 :了解更多关于配置解析器的信息

建议41 :使用Arg解析模块处理命令行参数

建议42 :使用熊猫处理大型CSV文件

python本身提供了一个CSV文件处理模块和诸如读取器和写入器之类的功能。

“熊猫可以提供阻止、合并等功能,这适用于数据量大的情况,也更便于二维数据操作。

建议43 :使用元素树解析XML

建议44 :了解模块Pickle的优缺点

优点:界面简单,所有平台通用,支持的数据类型范围广,扩展性强

缺点:不能保证数据操作的原子性,存在安全问题,并且不同语言之间不兼容

建议45 :序列化JSON模块的另一个选项:加载和转储操作

建议46 :使用回溯来获取堆栈信息

建议47 :使用日志记录记录信息

建议48 :使用线程模块编写多线程程序

建议49 :使用队列模块使多线程编程更安全

5 .设计模式

建议50 :用模块实现单例模式

建议51 :使用mixin模式使程序更加灵活

建议52 :与发布-订阅模式的松散耦合

建议53 :用状态模式美化代码

6 .内部机制

建议54 :理解内置对象

建议55 : init _ _ ( )不是一种构造方法,理解_ _ new ( )和it之间的区别

建议56 :了解变量的搜索机制,即范围

局部范围

全球范围

嵌套作用域

“内置范围

建议57 :为什么需要self参数

建议58 :理解MRO (方法解析顺序)和多重继承

建议59 :理解描述符机制

建议60 :区分GetAttr _ _ ( )和_ _ GetAttribute ( )方法

建议61 :使用更安全的财产

建议62 :掌握元类元类

建议63 :熟悉Python对象协议

建议64 :使用运算符重载实现infix语法

建议65 :熟悉Python的迭代器协议

建议66 :熟悉Python生成器

建议67 :理解基于生成器Ctrip和Greenlet的Ctrip、多线程和多进程之间的区别

建议68 :了解吉尔的局限性

建议69 :对象管理和垃圾收集

7。使用工具协助项目开发

建议70 :从PYPI安装第三方软件包

建议71 :使用PIP和蛋黄来安装和管理软件包

建议72 :贴纸会制作包装吗

建议73 :理解单元测试的概念

建议74 :为包编写单元测试

建议75 :使用测试驱动开发( TDD )来提高代码可测试性

建议76 :使用Pylint检查代码样式

代码风格评论

代码错误检查

“找到重复和不合理的代码以促进重构

“高度可配置和可定制

“支持集成各种ide和编辑器

可以基于Python代码生成UML图

“可以与Jenkins等连续集成工具相结合,以支持自动代码审查

建议77 :进行有效的代码审查

建议78 :向PYPI发布软件包

8。性能分析和优化

建议79 :理解代码优化的基本原则

建议80 :借助性能优化工具

建议81 :使用CPROFILE查找性能瓶颈

建议82 :使用Memory _ Profiler和OBJ图分析内存使用情况

建议83 :尝试降低算法的复杂度

建议84 :掌握循环优化的基本技能

“减少循环内的计算

将显式循环更改为隐式循环,这当然会损害代码的可读性

“尝试引用循环中的局部变量

关注内部嵌套循环

建议85 :使用发电机提高效率

建议86 :使用不同的数据结构优化性能

建议87 :充分利用SET的优势

建议88 :使用多处理模块来克服Gil缺陷

建议89 :使用线程池来提高效率

建议90 :使用C / c++模块扩展来提高性能

建议91 :使用Cythonb编写扩展

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181023A17GTD00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券