㊙️90条秘籍,助你成为Python高手㊙️
Python是一门简单易学、功能强大的编程语言,越来越多的人选择它作为进阶的编程语言。如果你已经掌握了一定的Python基础,那么《Effective Python》绝对是你不可错过的进阶宝典。这本书通过90个秘籍,让你更加深入地了解Python,成为真正的Python高手。本文就简单先列5个秘籍给大家先睹为快。
🔴一、辅助函数取代复杂表达式
在Python中,复杂的表达式往往让人头疼。而《Effective Python》的第5条秘籍就是教你如何用辅助函数来取代复杂的表达式,让代码更加简洁、易读。通过将复杂的逻辑封装成函数,我们可以让代码更加模块化,易于维护和重用。
📕二、数据结构直接拆分到多个变量里
有时候,我们需要同时处理多个数据结构中的元素。然而,通过下标访问往往会让代码变得繁琐。《Effective Python》的第6条秘籍告诉你,把数据结构直接拆分到多个变量里,可以让代码更加清晰、易读。这样,我们就可以直接使用变量名来访问数据结构中的元素,减少了下标的复杂度。
⭕三、使用enumerate取代range
在循环遍历列表或元组时,我们通常会使用range函数来获取索引。然而,《Effective Python》的第7条秘籍建议你使用enumerate函数来同时获取索引和元素值。这样,你就可以在循环中同时处理索引和元素值,减少了代码的复杂度。
📘四、用defaultdict处理内部状态中缺失的元素
在Python中,如果我们要在字典中查找某个键对应的值,而这个键不存在于字典中,就会抛出一个KeyError异常。《Effective Python》的第17条秘籍告诉你,使用defaultdict可以避免这种错误。defaultdict是一个内置的字典类,当键不存在时,会自动返回一个默认值。这样,我们就可以避免在处理字典时出现异常。
🌈五、不要把函数返回的多个数值拆分到三个以上的变量中
有时候,函数会返回多个数值。《Effective Python》的第19条秘籍建议你不要把返回的多个数值拆分到三个以上的变量中。这样做不仅会让代码变得混乱,而且还会增加调试的难度。相反,你应该尽量将返回的多个数值组合成一个新的数据结构(如元组、列表或字典),然后在需要的地方进行访问。
👍 《Effective Python》是一本非常实用的进阶书籍,通过90个秘籍帮助你更好地掌握Python编程技巧。如果你已经掌握了一定的Python基础,那么这本书绝对是你不可错过的进阶宝典。通过学习这些秘籍,你可以更加深入地了解Python,成为真正的Python高手。
👆请点击上面《EffectivePython》了解更多详情!☝️
书籍信息
书名:EffectivePython
作者:美/布雷特·斯拉特金
评分:9
出版日期:2021-01-01
出版社:机械工业出版社
ISBN:9787111674023
页数:388
定价:129
内容简介
本书可以帮你掌握真正的 Pythonic 编程方式,令你能够完全发挥出 Python 语言的强大功能,并写出健壮而高效的代码。Scott Meyers 在畅销书《Effective C++》中开创了一...
书籍目录
本书赞誉
译者序
前言
致谢
第1章 培养Pythonic思维 // 1
第1条 查询自己使用的Python版本 // 1
第2条 遵循PEP 8风格指南 // 2
第3条 了解bytes与str的区别 // 5
第4条 用支持插值的f-string取代C风格的格式字符串与str.format方法 // 9
第5条 用辅助函数取代复杂的表达式 // 19
第6条 把数据结构直接拆分到多个变量里,不要专门通过下标访问 // 21
第7条 尽量用enumerate取代range // 25
第8条 用zip函数同时遍历两个迭代器 // 26
第9条 不要在for与while循环后面写else块 // 28
第10条 用赋值表达式减少重复代码 // 31
第2章 列表与字典 // 37
第11条 学会对序列做切片 // 37
第12条 不要在切片里同时指定起止下标与步进 // 40
第13条 通过带星号的unpacking操作来捕获多个元素,不要用切片 // 42
第14条 用sort方法的key参数来表示复杂的排序逻辑 // 45
第15条 不要过分依赖给字典添加条目时所用的顺序 // 51
第16条 用get处理键不在字典中的情况,不要使用in与KeyError // 56
第17条 用defaultdict处理内部状态中缺失的元素,而不要用setdefault // 61
第18条 学会利用__missing__构造依赖键的默认值 // 63
第3章 函数 // 66
第19条 不要把函数返回的多个数值拆分到三个以上的变量中 // 66
第20条 遇到意外状况时应该抛出异常,不要返回None // 69
第21条 了解如何在闭包里面使用外围作用域中的变量 // 71
第22条 用数量可变的位置参数给函数设计清晰的参数列表 // 75
第23条 用关键字参数来表示可选的行为 // 77
第24条 用None和docstring来描述默认值会变的参数 // 80
第25条 用只能以关键字指定和只能按位置传入的参数来设计清晰的参数列表 // 83
第26条 用functools.wraps定义函数修饰器 // 88
第4章 推导与生成 // 91
第27条 用列表推导取代map与filter // 91
第28条 控制推导逻辑的子表达式不要超过两个 // 93
第29条 用赋值表达式消除推导中的重复代码 // 94
第30条 不要让函数直接返回列表,应该让它逐个生成列表里的值 // 97
第31条 谨慎地迭代函数所收到的参数 // 100
第32条 考虑用生成器表达式改写数据量较大的列表推导 // 104
第33条 通过yield from把多个生成器连起来用 // 106
第34条 不要用send给生成器注入数据 // 108
第35条 不要通过throw变换生成器的状态 // 113
第36条 考虑用itertools拼装迭代器与生成器 // 117
第5章 类与接口 // 122
第37条 用组合起来的类来实现多层结构,不要用嵌套的内置类型 // 122
第38条 让简单的接口接受函数,而不是类的实例 // 128
第39条 通过@classmethod多态来构造同一体系中的各类对象 // 131
第40条 通过super初始化超类 // 136
第41条 考虑用mix-in类来表示可组合的功能 // 140
第42条 优先考虑用public属性表示应受保护的数据,不要用private属性表示 // 144
第43条 自定义的容器类型应该从collections.abc继承 // 149
第6章 元类与属性 // 153
第44条 用纯属性与修饰器取代旧式的setter与getter方法 // 153
第45条 考虑用@property实现新的属性访问逻辑,不要急着重构原有的代码 // 157
第46条 用描述符来改写需要复用的@property方法 // 160
第47条 针对惰性属性使用__getattr__、__getattribute__及__setattr__ // 165
第48条 用__init_subclass__验证子类写得是否正确 // 170
第49条 用__init_subclass__记录现有的子类 // 177
第50条 用__set_name__给类属性加注解 // 181
第51条 优先考虑通过类修饰器来提供可组合的扩充功能,不要使用元类 // 185
第7章 并发与并行 // 191
第52条 用subprocess管理子进程 // 192
第53条 可以用线程执行阻塞式I/O,但不要用它做并行计算 // 195
第54条 利用Lock防止多个线程争用同一份数据 // 199
第55条 用Queue来协调各线程之间的工作进度 // 202
第56条 学会判断什么场合必须做并发 // 210
第57条 不要在每次fan-out时都新建一批Thread实例 // 214
第58条 学会正确地重构代码,以便用Queue做并发 // 218
第59条 如果必须用线程做并发,那就考虑通过ThreadPoolExecutor实现 // 224
第60条 用协程实现高并发的I/O // 226
第61条 学会用asyncio改写那些通过线程实现的I/O // 230
第62条 结合线程与协程,将代码顺利迁移到asyncio // 239
第63条 让asyncio的事件循环保持畅通,以便进一步提升程序的响应能力 // 245
第64条 考虑用concurrent.futures实现真正的并行计算 // 248
第8章 稳定与性能 // 253
第65条 合理利用try/except/else/finally结构中的每个代码块 // 253
第66条 考虑用contextlib和with语句来改写可复用的try/finally代码 // 258
第67条 用datetime模块处理本地时间,不要用time模块 // 262
第68条 用copyreg实现可靠的pickle操作 // 265
第69条 在需要准确计算的场合,用decimal表示相应的数值 // 272
第70条 先分析性能,然后再优化 // 274
第71条 优先考虑用deque实现生产者-消费者队列 // 278
第72条 考虑用bisect搜索已排序的序列 // 284
第73条 学会使用heapq制作优先级队列 // 286
第74条 考虑用memoryview与bytearray来实现无须拷贝的bytes操作 // 294
第9章 测试与调试 // 300
第75条 通过repr字符串输出调试信息 // 301
第76条 在TestCase子类里验证相关的行为 // 304
第77条 把测试前、后的准备与清理逻辑写在setUp、tearDown、setUpModule与tearDownModule中,以防用例之间互相干扰 // 309
第78条 用Mock来模拟受测代码所依赖的复杂函数 // 312
第79条 把受测代码所依赖的系统封装起来,以便于模拟和测试 // 319
第80条 考虑用pdb做交互调试 // 322
第81条 用tracemalloc来掌握内存的使用与泄漏情况 // 326
第10章 协作开发 // 329
第82条 学会寻找由其他Python开发者所构建的模块 // 329
第83条 用虚拟环境隔离项目,并重建依赖关系 // 330
第84条 每一个函数、类与模块都要写docstring // 335
第85条 用包来安排模块,以提供稳固的API // 339
第86条 考虑用模块级别的代码配置不同的部署环境 // 344
第87条 为自编的模块定义根异常,让调用者能够专门处理与此API有关的异常 // 346
第88条 用适当的方式打破循环依赖关系 // 350
第89条 重构时考虑通过warnings提醒开发者API已经发生变化 // 355
第90条 考虑通过typing做静态分析,以消除bug // 361