分享一下如何编写高效且优雅的 Python 代码
本文部分提炼自书籍:《Effective Python》&《Python3 Cookbook》,但也做出了修改,并加上了作者自己的理解和运用中的最佳实践。 全文约 9956 字,读完可能需要 24 分钟。 Pythonic列表切割
如果从列表开头开始切割,那么忽略 start 位的 0,例如 如果一直切到列表尾部,则忽略 end 位的 0,例如 切割列表时,即便 start 或者 end 索引跨界也不会有问题 列表切片不会改变原列表。索引都留空时,会生成一份原列表的拷贝 列表推导式 使用列表推导式来取代 不要使用含有两个以上表达式的列表推导式 数据多时,列表推导式可能会消耗大量内存,此时建议使用生成器表达式 迭代 需要获取 index 时使用
用
关于 循环正常结束之后会调用 循环里通过 要遍历的序列为空时,立即执行 反向迭代 对于普通的序列(列表),我们可以通过内置的 除此以外,还可以通过实现类里的
如果
最终一定会执行 函数使用装饰器 装饰器用于在不改变原函数代码的情况下修改已存在的函数。常见场景是增加一句调试,或者为已有的函数增加 举个栗子: 除此以外,还可以编写接收参数的装饰器,其实就是在原本的装饰器上的外层又嵌套了一个函数: 但是像上面那样使用装饰器的话有一个问题: 也就是说原函数已经被装饰器里的 Python 自带的
此外,有时候我们的装饰器里可能会干不止一个事情,此时应该把事件作为额外的函数分离出去。但是又因为它可能仅仅和该装饰器有关,所以此时可以构造一个装饰器类。原理很简单,主要就是编写类里的 使用生成器
用这种方法有几个小问题: 每次获取到符合条件的结果,都要调用 返回的 数据都存在 因此,使用生成器 获取到一个生成器以后,可以正常的遍历它: 如果你还是需要一个列表,那么可以将函数的调用结果作为参数,再调用 可迭代对象 需要注意的是,普通的迭代器只能迭代一轮,一轮之后重复调用是无效的。解决这种问题的方法是,你可以定义一个可迭代的容器类: 这样的话,将类的实例迭代重复多少次都没问题: 但要注意的是,仅仅是实现 使用位置参数 有时候,方法接收的参数数目可能不一定,比如定义一个求和的方法,至少要接收两个参数: 对于这种接收参数数目不一定,而且不在乎参数传入顺序的函数,则应该利用位置参数 但要注意的是,不定长度的参数 使用关键字参数 关键字参数可提高代码可读性 可以通过关键字参数给函数提供默认值 便于扩充函数参数 定义只能使用关键字参数的函数 普通的方式,在调用时不会强制要求使用关键字参数 使用 Python3 中强制关键字参数的方式 使用 Python2 中强制关键字参数的方式 关于参数的默认值 算是老生常谈了:函数的默认值只会在程序加载模块并读取到该函数的定义时设置一次 也就是说,如果给某参数赋予动态的值( 比如 因此,更推荐使用 类 默认情况下,Python 用一个字典来保存一个对象的实例属性。这使得我们可以在运行的时候动态的给类的实例添加新的属性: 然而这个字典浪费了多余的空间 -― 很多时候我们不会创建那么多的属性。因此通过 不要使用字典而是固定集合来分配空间。
通过定义类中的 通过这种方式实现的好处是,可以通过类的属性来保存状态,而不必创建一个闭包或者全局变量。
类内部普通的方法,都是以
来通过实例了解它们的使用场景: 假设我们需要创建一个名为 上述代码创建了 但如果我们想改变属性传入的方式呢?毕竟,在初始化时就要传入年/月/日三个属性还是很烦人的。能否找到一个方法,在不改变现有接口和方法的情况下,可以通过传入 你可能会想到这样的方法: 但不够好: 在类外额外多写了一个方法,每次还得格式化以后获取参数 这个方法也只跟 没有解决传入参数过多的问题 此时就可以利用 这样,我们就可以通过 好处: 在 可以在其中进一步封装该方法,提高复用性 更加符合面向对象的编程方式 而 方法作为 将与日期相关的辅助类函数作为 创建上下文管理器 上下文管理器,通俗的介绍就是:在代码块执行前,先进行准备工作;在代码块执行完成后,做收尾的处理工作。 通过 比较繁琐吧?所以说使用上下文管理器的好处就是,通过调用我们预先设置好的回调,自动帮我们处理代码块开始执行和执行完毕时的工作。而通过自定义类的 然后可以以这样的方式进行调用: 在调用的时候:
然后调用
上一步的结果被传递给 在 读取完成之后,
要注意的是,在 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |