
Effective Python
文章平均质量分 92
@风之所往
zhangsihui.pythonanywhere.com
展开
-
Effective Python -- 第 8 章 部署(下)
第 8 章 部署(下) 第 57 条:考虑用 pdb 实现交互调试 编写程序的时候,总会遇到代码中的 bug。print 函数可以帮我们追查到很多问题的来源。针对具体用例编写测试,也是一种隔离可疑代码并寻找错误根源的好办法。 但是这些手段未必总是能查到问题的根源。如果要使用更为强大的调试工具,那就请试试 Python 内置的交互调试器(interactive debugger)。这种调试器能够检视程序状态、打印局部变量,并能够以步进的方式来执行程序中的每一条语句。 在其他大部分编程语言中,先必须告诉调试器应原创 2021-04-25 20:54:56 · 208 阅读 · 1 评论 -
Effective Python -- 第 8 章 部署(上)
第 8 章 部署(上) 第 54 条:考虑用模块级别的代码来配置不同的部署环境 所谓部署环境(deployment environment)就是程序在运行的时候所用的一套配置。每个程序至少都会有一种部署环境,这就是生产环境(production environment,产品环境)。制作程序的首要目标,就是为了能在生产环境中运行它,并产生某种成效。 但是,在编写和修改程序代码的过程中,却必须要在开发程序所用的那台电脑上面运行它。而这套开发环境的配置方式,可能与生产环境有很大区别。例如,可能会在 Linux 工原创 2021-04-18 23:36:29 · 181 阅读 · 0 评论 -
Effective Python -- 第 7 章 协作开发(下)
第 7 章 协作开发(下) 第 52 条:用适当的方式打破循环依赖关系 在和他人协作时,难免会写出相互依赖的模块。而有的时候,即使自己一个人开发程序,也仍然会写出相互依赖的代码。 例如,GUI(图形用户界面)程序要显示一个对话框,请用户来选择文档的保存地点。程序可以在事件处理器(event handler)里,把需要显示在对话框中的数据,通过参数传递过去。而对话框那边,也需要读取一些全局状态,例如,它要根据用户的配置信息(user preferences,用户偏好)来决定如何把自身正确地渲染出来。 下面定义原创 2021-04-11 22:11:26 · 265 阅读 · 0 评论 -
Effective Python -- 第 7 章 协作开发(上)
第 7 章 协作开发(上) 第 49 条:为每个函数、类和模块编写文档字符串 由于 Python 是一门动态语言,所以文档显得极其重要。Python 对文档提供了内置的支持,使得开发者可以把文档与代码块关联起来。与其他许多编程语言不同,Python 程序在运行的时候,能够直接访问源代码中的文档信息。 例如,在为函数编写了 def 语句之后,可以紧接着提供 docstring,以便将一段开发文档与该函数关联起来: def palindrome(word): """Return True if the原创 2021-04-04 23:29:03 · 209 阅读 · 0 评论 -
Effective Python -- 第 6 章 内置模块(下)
第 6 章 内置模块(下) 第 45 条:应该用 datetime 模块来处理本地时间,而不是用 time 模块- 协调世界时(Coordinated Universal Time,UTC)是一种标准的时间表述方式,它与时区无关。有些计算机,用某一时刻与 UNIX 时间原点之间相差的秒数,来表示那个时刻所对应的时间,对于这些计算机来说,UTC 是一种非常好的计时方式。但是对于普通人来说,使用 UTC 来描述时间,却不太合适,因为我们通常都是根据当前所在的地点来描述时间的。我们会说“正午”( noon)或“早原创 2021-03-28 17:54:02 · 310 阅读 · 0 评论 -
Effective Python -- 第 6 章 内置模块(上)
第 6 章 内置模块(上) 第 42 条:用 functools.wraps 定义函数修饰器 Python 用特殊的语法来表示修饰器(decorator),这些修饰器可以用来修饰函数。对于受到封装的原函数来说,修饰器能够在那个函数执行之前以及执行完毕之后,分别运行一些附加代码。这使得开发者可以在修饰器里面访问并修改原函数的参数及返回值,以实现约束语义(enforce semantics)、调试程序、注册函数等目标。 例如,要打印某个函数在受到调用时所接收的参数以及该函数的返回值。对于包含一系列函数调用的递归原创 2021-03-21 21:14:03 · 200 阅读 · 0 评论 -
Effective Python -- 第 5 章 并发与并行(下)
第 5 章 并发与并行(下) 第 39 条:用 Queue 来协调各线程之间的工作 如果 Python 程序同时要执行许多事务,那么开发者经常需要协调这些事务。而在各种协调方式中,较为高效的一种,则是采用函数管线。 管线的工作原理,与制造业中的组装生产线(assembly line)相似。管线分为许多首尾相连的阶段(phase,环节),每个阶段都由一种具体的函数来负责。程序总是把待处理的新部件添加到管线的开端。每一种函数都可以在它所负责的那个阶段内,并发地处理位于该阶段的部件。等负责本阶段的那个函数,把某个原创 2021-03-14 22:38:38 · 286 阅读 · 0 评论 -
Effective Python -- 第 5 章 并发与并行(上)
第 5 章 并发与并行(上) 第 36 条:用 subprocess 模块来管理子进程 Python 提供了一些非常健壮的程序库,用来运行并管理子进程,这使得 Python 语言能够很好地将命令行实用程序(command-line utility)等工具黏合起来。现有的 shell 脚本一般都会越写越复杂,在这种情况下,为了使程序代码更易读懂且更易维护,很自然地就会考虑用 Python 改写。 由 Python 所启动的多个子进程,是可以平行运作的,这使得我们能够在 Python 程序里充分利用电脑中的全部原创 2021-03-07 17:04:03 · 326 阅读 · 0 评论 -
Effective Python -- 第 4 章 元类及属性(下)
第 4 章 元类及属性(下) 第 32 条:用 __getattr__、__getattribute__ 和 __setattr__ 实现按需生成的属性 Python 语言提供了一些挂钩,使得开发者很容易就能编写出通用的代码,以便将多个系统黏合起来。例如,我们要把数据库的行(row)表示为 Python 对象。由于数据库有自己的一套结构(schema),所以在操作与行相对应的对象时,必须知道这个数据库的结构。然而,把 Python 对象与数据库相连接的这些代码,却不需要知道行的结构,所以,这部分代码应该写得原创 2021-02-28 22:37:35 · 234 阅读 · 0 评论 -
Effective Python -- 第 4 章 元类及属性(上)
第 4 章 元类及属性(上) 第 29 条:用纯属性取代 get 和 set 方法 从其他语言转入 Python 的开发者,可能会在类中明确地实现 getter(获取器)和 setter(设置器)方法。 class OldResistor(object): def __init__(self, ohms): self._ohms = ohms def get_ohms(self): return self._ohms def set_ohms(se原创 2021-02-21 22:05:46 · 208 阅读 · 0 评论 -
Effective Python -- 第 3 章 类与继承(下)
第 3 章 类与继承(下) 第 25 条: 用 super 初始化父类 初始化父类的传统方式,是在子类里用子类实例直接调用父类的 __init__ 方法。 class MyBaseClass(object): def __init__(self, value): self.value = value class MyChildClass(MyBaseClass): def __init__(self): MyBaseClass.__init__(self,原创 2021-02-14 23:48:12 · 263 阅读 · 1 评论 -
Effective Python -- 第 3 章 类与继承(上)
第 3 章 类与继承(上) 第 22 条:尽量用辅助类来维护程序的状态,而不要用字典和元组 Python 内置的字典类型可以很好地保存某个对象在其生命周期里的动态内部状态。所谓动态(dynamic),是指这些待保存的信息,其标识符无法提前获知。例如,要把许多学生的成绩记录下来,但这些学生的名字,事先并不知道。于是,可以定义一个类,把学生名字全部保存到字典里面,这样就不用把每个学生都表示成对象了,也无需在每个对象中预设一个存放其名字的属性。 class SimpleGradebook(object):原创 2021-02-07 23:47:40 · 316 阅读 · 0 评论 -
Effective Python -- 第 2 章 函数(下)
第 2 章 函数(下) 第 18 条:用数量可变的位置参数减少视觉杂讯 令函数接受可选的位置参数(由于这种参数习惯上写为 *args,所以又称为 star args,星号参数),能够使代码更加清晰,并能减少视觉杂讯(visual noise)。 例如,要定义 log 函数。以便把某些调试信息打印出来。加入该函数的参数个数固定不变,那它就必须接受一段信息及一份有待打印值的列表。 def log(message, values): if not values: print(message原创 2021-01-31 23:58:36 · 235 阅读 · 1 评论 -
Effective Python -- 第 2 章 函数(上)
第 2 章 函数(上) 第 14 条:尽量用异常来表示特殊情况,而不要返回 None 编写工具函数(utility function)时,Python 程序员喜欢给 None 这个返回值赋予特殊意义。这么做有时是合理的。例如,要编写辅助函数,计算两数相除的商。在除数为 0 的情况下,计算结果是没有明确含义的(undefined,未定义的),所以似乎应该返回 None。 def divide(a, b): try: return a / b except ZeroDivisio原创 2021-01-24 23:55:51 · 334 阅读 · 0 评论 -
Effective Python -- 第 1 章 用 Pythonic 方式来思考(下)
第 1 章 用 Pythonic 方式来思考(下) 第 7 条:用列表推导式来取代 map 和 filter Python 提供了一种精炼的写法,可以根据一份列表来制作另外一份。这种表达式称为 list comprehension(列表推导)。例如,要用列表中每个元素的平方值构建另一份列表。如果采用列表推导来实现,那就同时指定制作新列表时所要迭代的输入序列,以及计算新列表中每个元素的值时所用的表达式。 a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] squares = [x**2 f原创 2021-01-17 23:21:22 · 278 阅读 · 3 评论 -
Effective Python -- 第 1 章 用 Pythonic 方式来思考(上)
第 1 章 用 Pythonic 方式来思考(上) 该系列文章为图书 《Effective Python:编写高质量 Python 代码的 59 个有效方法》(英文名称为 《Effective Python: 59 Specific Ways to Write Better Python》)的内容总结,侵删。 第 1 条:确认自己所用的 Python 版本 很多电脑都预装了多个版本的标准 CPython 运行时环境(似乎并不是,Windows 不预装,Ubuntu 16 预装 Python 2,Ubunt原创 2021-01-11 00:01:30 · 324 阅读 · 0 评论