"/>
侧边栏壁纸
博主头像
PySuper 博主等级

千里之行,始于足下

  • 累计撰写 236 篇文章
  • 累计创建 15 个标签
  • 累计收到 2 条评论

目 录 CONTENT

文章目录

改善 Python 代码的 91 个建议

PySuper
2019-10-30 / 0 评论 / 0 点赞 / 70 阅读 / 2555 字
温馨提示:
本文最后更新于 2024-05-28,若内容或图片失效,请留言反馈。 所有牛逼的人都有一段苦逼的岁月。 但是你只要像 SB 一样去坚持,终将牛逼!!! ✊✊✊

受益于《编写高质量代码 改善 Python 程序的 91 个建议》,大家有时间可以看下

基础(1-7)

  1. 理解 Pythonic 概念
  2. 编写 Pythonic 代码
  3. 理解 Python 与 C 语言的不同之处
  4. 在代码中适当添加注释
  5. 通过适当添加空行是代码布局更优雅、合理
  6. 编写函数的 4 个原则、
    • 函数设计要尽量短小,嵌套层次不宜过深
    • 函数申明应该做到合理、简单、易于使用
    • 函数参数设计应该考虑向下兼容
    • 一个函数只做一件事,尽量保证函数语句粒度的一致性
  7. 将变量集中到一个文件

编程惯用法(8-18)

  1. 利用 assert(断点)语句来发现问题
  2. 数据交换值的时候不推荐使用中间变量
  3. 充分利用 Lazy evaluatin (延迟计算) 的特性 > 生成器
    • 避免不必要的计算,带来性能上的提升
    • 节省空间,是的无限循环的数据结构成为可能
  4. 理解枚举替代实现的缺陷
    • 使用类属性
    • 借助函数
    • 使用 collections.namedtuple
  5. 不推荐使用type来进行类型检查:基于内建类型扩展的用户自定义类型,type 并不能准确返回结果
  6. 尽量转换为浮点类型后再做除法
  7. 警惕 eval () 的安全漏洞
    • 如果对象不是信任源,应该尽量避免使用 eval
    • 在需要使用 eval 的地方可用安全性更好的 ast.literal_eval 替代
  8. 使用 enumerate () 获取序列迭代的索引和值
li = [1, 2, 3, 4]

for i, e in enumerate(li):
    print("index": i)
    print("element": e)
  1. 分清 == 和 is 的使用场景
    • ==:检查两个对象的值是否相等
    • is:检查对象的标识符是否一致,比较两个对象在内存中是否拥有同一块内存
  2. 考虑兼容性,尽可能使用Unicode!!!
  3. 构建合理的包层次来管理 module
    • 合理组织代码,便于维护和使用
    • 能够有效的避免名称空间冲突

基础语法(19-35)

  1. ` 有节制的使用 from…import… 语句
    • 一般情况下尽量优先使用 import A(A.b)
    • 有节制的使用 form A import b (直接访问 b)
    • 尽量避免 from A import * (污染命名空间)
  2. 优先使用 absolute imort 来导入模块
  3. i += 1不等于++i
  4. 使用 with 自动关闭资源
  5. 使用 else 子句简化循环(异常处理)
  6. 遵循异常处理的几点基本原则
    • 注意异常的粒度,不推荐在 try 中放入过多的代码
    • 谨慎使用单独的 except 语句来处理所有异常
    • 注意异常捕获的顺序,在合适的层次处理异常
    • 使用更为友好的异常信息,遵循异常参数的规范
  7. 避免 finally 中可能发生的陷阱,不推荐在 finally 中 return 返回
  8. 深入理解 None,正确判断对象是否为空
  9. 连接字符串应优先使用join而不是+
  10. 格式化字符串时尽量使用.format方式而不是%
  11. 区别对待可变对象和不可变对象
  12. ()、[]、{}:一致的容器初始化形式
  13. 记住函数传参既不是传值也不是传引用
  14. 警惕默认参数潜在的问题
  15. 慎用变长参数
    • *args 来实现可变参数列表
    • **kwargs 接受字典形式的关键字参数列表
      • 装饰器
      • 参数的数目不确定
      • 实现函数的多态或者继承情况下子类需要调用父类的某些方法
  16. 深入了解 str () 和 repr () 的区别
    • 两者目标不同
      • str ():主要面向用户,目的是可读性
      • repr ():面向 Python 解释器,目的是准确性
    • 在解释器中直接输入 a 时默认调用 repr (),而 print (a) 调用 str ()
    • repr () 的返回值一般可以用 eval () 函数还原
    • 分别调用內建的__str () 和__repr (),一般类中都有__repr ()__,而__str ()__为可选
  17. 分清 staticmethod(静态方法)和 classmethod(类方法)的适用场景
class A(object):
    @staticmethod
    def a(arg1):
        pass

class B(object):
    @classmethod
    def b(arg2):
        pass

库(36-49)

  1. 掌握字符串的基本用法
  2. 按需选择 sort () 或者 sorted ()
    • 相对于 sort (),sorted () 适用范围更广
    • 当排序对象为列表时,适用不同
    • 两者传入参数 key 比传入参数 cmp 效率更高
    • sorted () 函数功能非常强大,可以方便的针对不同的数据结构进行排序
      • 对字典进行排序
      • 多维 list 排序
      • 字典中混合 list 排序
      • list 中混合字典排序
  3. 使用 copy 模块深拷贝对象
    • 深拷贝:构造一个新的复合对象,并将原对象中发现的引用插入该对象中
    • 浅拷贝:构造一个新的复合对象,遇到引用会继续递归拷贝其所指向的具体内容
  4. 使用 Counter 进行计数统计
  5. 深入掌握 ConfigParser
  6. 使用 argparse 处理命令行参数
  7. 使用pandas处理大型csv文件
  8. 一般情况使用ElementTree解析XML
  9. 理解模块 pickle 优劣
  10. 序列化的另一个不错的选择–JSON
  11. 使用 traceback 获取栈信息
  12. 使用 logging 记录日志信息
  13. 使用threading木块编写多线程程序
    49 使用Queue使多线程编程更安全

设计模式(50-53)

  1. 利用模块实现单例模式
  2. 用 mini 模式让程序更灵活
  3. 用发布订阅模式实现松耦合
  4. 用状态模式美化代码

内部机制(54-69)

  1. 理解 built-in objects
  2. __init__()不是构造方法
  3. 理解名字查找机制
    • 局部作用域
    • 全局作用域
    • 嵌套作用域
    • 内置作用域
  4. 为什么需要self参数
  5. 理解 MRO 与多继承
  6. 理解描述符机制
  7. 区别__getattr__() 和__getattrbute__() 方法
  8. 使用更为安全的property
    • 代码更简洁,可读性更高
    • 更好的管理属性的访问
    • 代码可维护性更好
    • 控制属性访问权限
  9. 掌握 metaclass(元类)
  10. 熟悉 Python 对象协议
  11. 利用操作符重载视线中缀语法
  12. 熟悉 Python 迭代器协议
    • 实现__iter__() 方法,返回一个迭代器
    • 实现 next () 方法,返回当前元素,并指向下一个元素位置,如果当前已无元素,则抛出 StopIteration 异常
  13. 熟悉 Python 生成器
  14. 基于生成器的协程及 greenlet
  15. 理解 GIL 的局限性
  16. 对象的管理与垃圾回收

实用工具辅助项目开发(70-78)

  1. 从 PyPI 安装包
  2. 使用 pip 和 yolk 安装、管理包
  3. 做 paster 创建包
  4. 理解单元测试概念
  5. 为包编写单元测试
  6. 利用测试驱动开发提高代码的可测性
  7. 使用 Pylint 检查代码风格
  8. 进行高效的代码审查
  9. 将包发布到 PyPI

性能剖析与优化(79-91)

  1. 了解代码优化的基本原则
    • 优先保证代码是可工作的
    • 权衡优化的代价
    • 定义性能指标,集中力量解决首要问题
    • 不要忽略可读性
  2. 借助性能优化工具
  3. 利用 cProfile 定位性能瓶颈
  4. 使用 memory_profiler 和 objgraph 剖析内存使用
  5. 努力降低算法复杂度
  6. 掌握循环优化的基本技巧
  7. 使用生成器提高效率
  8. 使用不同的数据结构优化性能
  9. 充分利用 set 的优势
    • 对 list 求相同的元素,set 求并集
    • 向 list 和 set 中添加元素,当元素规模为 100 时,list 耗时 set 的 9 倍
  10. 使用 multiprocessing 客服 GIL 的缺陷
  11. 使用线程池提高效率
  12. 使用 C/C++ 模块扩展高性能
  13. 使用 Cython 编写扩展模块
0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区