编写高质量代码:91 个改进编程的技巧
1. 简介
建议1:理解概念——详情见《禅》
技巧 2:编写代码
(1)避免不规范的代码,比如只通过大小写来区分变量,使用容易混淆的变量名,害怕变量名太长等。有时候长变量名可以让代码更易读。
(2)深入学习相关知识,如语言特性、库特性、演进过程等,深入学习一到两个业界认可的代码库,如Flask。
提示3:了解与C的区别,例如缩进和{},单引号和双引号,三元运算符?,-Case语句等。
提示 4:在代码中添加适当的注释
建议五:适当添加空行,让代码布局更加合理
技巧 6:编写函数的 4 个原则
(1)函数设计尽量简短,嵌套层次不宜过深
(2)函数声明要合理、简单、易用
(3)函数参数设计要考虑向后兼容性
(4)一个函数只做一件事,尽量保证函数粒度的一致性
提示 7:将常量保存在一个文件中,并尽可能使用全部大写字母。
2. 编程习惯用法
技巧 8:使用语句查找问题,但要注意断言会影响效率
建议9:交换数据值时不建议使用临时变量。而是直接使用a,b = b,a
技巧 10:利用惰性计算来避免不必要的计算
技巧11:了解枚举替代实现的缺陷(最新版本已添加枚举功能)
建议十二:不建议使用type进行类型检查,因为有时候type的结果不一定可靠,必要时建议使用函数代替。
提示 13:在进行除法之前尝试将变量转换为浮点类型(以后不用担心)
提示 14:警惕 eval() 函数中的安全漏洞,这些漏洞有点类似于 SQL 注入
技巧 15:使用 () 获取序列迭代的索引和值
建议 16:区分 == 和 is,特别是在比较字符串等不可变类型时(详情见注释)
建议 17:尽可能使用它。在 .NET 中编码是一件令人头疼的事情,但你不必考虑太多。
建议 18:构建合理的包层次结构来管理
3.基本用法
建议 19:谨慎使用 from... 语句以避免命名空间污染
技巧 20:首先使用导入模块(已删除)
建议21:i+=1 不等于++i。在 中,++i 前的加号仅表示正号,而不是运算。
建议 22:习惯使用 with 自动关闭资源,特别是在读写文件时
技巧 23:使用 else 子句简化循环(异常处理)
建议 24:遵循异常处理的一些基本原则
(1)注意异常的粒度,在try块中写尽可能少的代码
(2)谨慎使用个别语句或陈述,并找出具体的例外情况。
(3)注意异常捕获的顺序,在适当的层次处理异常
(4)使用更加友好的异常信息,并遵守异常参数的规范
建议 25:避免潜在的陷阱
Tip 26:深入理解None,正确判断对象是否为空。
建议 27:使用 join 函数代替 + 运算符来连接字符串
技巧 28:格式化字符串时使用函数代替 %
建议 29:区别对待可变对象和不可变对象,尤其是用作函数参数时
提示 30:[]、{} 和 ():一致的容器初始化格式。使用列表推导式可以使代码更清晰、更高效。
提示31:向函数传递参数时,不要通过值或引用传递,而要通过对象或对象引用传递。
建议 32:警惕默认参数的潜在问题,尤其是当默认参数是可变对象时
建议 33:在函数中谨慎使用可变长度参数 args 和 kargs
(1)这种用法过于灵活,导致函数签名不清晰,难以阅读。
(2)如果函数参数过多,通过使用可变长度参数来简化函数定义,那么该函数通常可以重构
建议 34:理解 str() 和 repr() 之间的区别
(1)二者的目标不同:str主要面向客户,其目的是可读性,返回值是一个既方便用户使用又可读的字符串;而repr是面向解释器或者开发者的,其目的是准确性,它的返回值代表解释器内部的定义。
(2)当你在解释器中直接输入变量时,默认调用repr函数,而print(var)默认调用str函数。
(3)repr函数的返回值一般可以使用eval函数恢复
(4)两者分别调用对象的内置函数()和()。
技巧35:区分静态方法和类方法的使用场景
4. 图书馆的使用
技巧36:掌握字符串的基本用法
建议 37:选择 sort() 和 when() 函数
sort() 对列表进行排序,因此它无法对元组等不可变类型进行排序。
() 可以对任何可迭代类型进行排序,而不会改变原始变量本身。
技巧38:使用copy模块深度复制对象,区分浅复制和深复制
建议39:在模块中使用计数统计,它是字典类的子类
建议 40:深化你的知识
建议 41:使用模块来处理命令行参数
技巧 42:使用 CSV 处理大型 CSV 文件
提供了CSV文件处理模块,提供了等功能。
能够提供块切分、合并处理,适合数据量较大的情况,更方便二维数据操作。
建议 43:使用解析的 XML
建议 44:了解模块的优缺点
优点:接口简单、跨平台通用、支持的数据类型广泛、扩展性强
缺点:无法保证数据操作的原子性、存在安全问题、不同语言之间不兼容
建议45:序列化JSON模块的另一种选择:加载和转储操作
提示 46:使用获取堆栈信息
建议 47:使用日志信息
建议 48:使用模块编写多线程程序
建议 49:使用 Queue 模块让多线程编程更安全
5.设计模式
建议 50:使用模块来实现单例模式
建议 51:使用 mixin 模式让你的程序更加灵活
建议 52:使用发布 - 订阅模式实现松散耦合
建议 53:使用状态模式美化你的代码
6. 内部机制
建议 54:理解内置对象
提示55:()不是构造函数,了解它和它之间的区别
技巧56:理解变量查找机制,即作用域
本地范围
全局范围
嵌套作用域
内置范围
提示57:为什么需要 self 参数?
建议 58:理解 MRO(方法解析顺序)和多重继承
建议59:理解描述符机制
建议 60:区分 () 和 () 方法
建议 61:使用更安全的
建议 62:掌握元类
建议 63:熟悉对象协议
技巧 64:使用运算符重载实现中缀语法
技巧 65:熟悉的迭代器协议
建议 66:熟悉的生成器
建议 67:基于生成器的协程,并了解协程、多线程和多处理之间的区别
建议 68:了解 GIL 的局限性
技巧 69:对象管理和垃圾收集
7. 使用工具协助项目开发
建议 70:从 PyPI 安装第三方包
技巧 71:使用 pip 和 yolk 安装和管理软件包
建议 72:创建一个包
建议 73:理解单元测试的概念
建议 74:为你的包编写单元测试
建议 75: 使用测试驱动开发 (TDD) 来提高代码的可测试性
建议 76:使用代码风格检查
代码风格审查
代码错误检查
发现重复和不合理的代码,以便于重构
高度可配置和可定制
支持与各种 IDE 和编辑器集成
能够根据代码生成 UML 图
可以与持续集成工具结合,例如,支持自动代码审查
建议 77:进行有效的代码审查
建议 78:将软件包发布到 PyPI
8.性能分析与优化
建议 79:理解代码优化的基本原则
建议 80:使用性能优化工具
建议 81:利用并定位性能瓶颈
建议 82:使用并分析内存使用情况
建议83:努力降低算法复杂度
建议 84:掌握循环优化的基本技巧
减少循环内的计算
将显式循环改为隐式循环,当然这会牺牲代码的可读性
尝试在循环中引用局部变量
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。