python语言及其应用-笔记

全书概览

1-5 章从底向上,讲述了 python 程序的组成。从最基本的元素(数字、字符串)到模块,包(python 文件的集合)。

  • python 基本元素: 数字、字符串、变量
  • python 容器:列表、元组、字典和集合
  • python 外壳:循环、推导式、函数、生成器、装饰器、作用域和异常处理
  • python 盒子:模块、包和程序

第 6 章对象和类,对象的创建、继承、特殊方法
第 7、8 章 数据处理及存储。字符串、二级制、文件、结构化文本(csv、json)、数据库
第 9 章 剖析 web,讲述 web client ,web server,web 自动化。使用标准库构建简单的 web client 和 web server,web 框架的使用 Bottle、Flask、webbrowser。
第 10 章 干家务活的系统模块 os,能处理文件、目录、进程和程序、日期。
第 11 章 并发和网络。multiprocessing 模块实现多进程、标准库实现 TCP/IP 模型,ZeroMQ 发布订阅模式。
第 12 章 熟练 python 开发则武器。标准库里抄代码,pip 包管理、pylint 代码检查、代码测试(unittests、doctest)pdb 调试和日志调式。
附录 ABCDEF python 在图像处理、工作处理、科学处理方面的应用及其他内容。

我学到的

熟悉了推导式,少用 for 循环,包括列表推导式、字典推导式、集合推导式、生成器推导式。
熟悉了函数的*收集位置参数,**收集关键字参数。
对并发编程使用队列有了进一步理解。
代码规范检查 pylint,使代码更编写规范。
doctest 在函数中执行类似于命令行的单步测试,能提高调试效率。

下一步计划

  1. 在代码中添加 doctest
  2. 遇到并发相关问题再读相关章节
  3. 扫描标准库,对标准库提供的常用功能熟悉。多看标准库代码。
  4. python 工匠 并理解(在头脑中重构印象)并讲解

摘录

何时用对象和类而不是模块

有一些方法可以帮助你决定是把你的代码封装到类里还是模块里。
• 当你需要许多具有相似行为(方法)但不同状态(特性)的实例时,使用对象是最好的选择。

• 类支持继承,但模块不支持。

• 如果你想要保证实例的唯一性,使用模块是最好的选择。不管模块在程序中被引用多少次,始终只有一个实例被加载。(对 Java 和 C++ 程序员来说,如果读过 Erich Gamma 的《设计模式:可复用面向对象软件的基础》,可以把 Python 模块理解为单例。)

• 如果你有一系列包含多个值的变量,并且它们能作为参数传入不同的函数,那么最好将它们封装到类里面。举个例子,你可能会使用以 size 和 color 为键的字典代表一张彩色图片。你可以在程序中为每张图片创建不同的字典,并把它们作为参数传递给 scale() 或者 transform() 之类的函数。但这么做的话,一旦你想要添加其他的键或者函数会变得非常麻烦。为了保证统一性,应该定义一个 Image 类,把 size 和 color 作为特性,把 scale() 和 transform() 定义为方法。这么一来,关于一张图片的所有数据和可执行的操作都存储在了统一的位置。

• 用最简单的方式解决问题。使用字典、列表和元组往往要比使用模块更加简单、简洁且快速。而使用类则更为复杂。

创始人 Guido 的建议:

不要过度构建数据结构。尽量使用元组(以及命名元组)而不是对象。尽量使用简单的属性域而不是 getter/setter 函数……内置数据类型是你最好的朋友。尽可能多地使用数字、字符串、元组、列表、集合以及字典。多看看容器库提供的类型,尤其是双端队列。—— Guido van Rossum

闭包

内部函数可以看作一个闭包。闭包是一个可以由另一个函数动态生成的函数,并且可以改
变和存储函数外创建的变量的值。

• inner2() 直接使用外部的 saying 参数,而不是通过另外一个参数获取。
• knights2() 返回值为 inner2 函数,而不是调用它。

def knights2(saying):
… def inner2():
… return “We are the knights who say: ‘%s’” % saying
… return inner2

inner2() 函数可以得到 saying 参数的值并且记录下来。return inner2 这一行返回的是
inner2 函数的复制(没有直接调用)。所以它就是一个闭包:一个被动态创建的可以记录
外部变量的函数。
用不同的参数调用 knights2() 两次:
a = knights2(‘Duck’)
b = knights2(‘Hasenpfeffer’)
那么 a 和 b 会是什么类型?
type(a)
‘function’>
type(b)
‘function’>
它们是函数,同时也是闭包:
a
.inner2 at 0x10193e158>
b
.inner2 at 0x10193e1e0>
如果调用它们,它们会记录被 knights2 函数创建时的外部变量 saying:
a()
“We are the knights who say: ‘Duck’”
b()
“We are the knights who say: ‘Hasenpfeffer’”