《Python基础教程(第二版)》阅读记录

# 一、快速改造

  • //双斜线执行整除,只能用在Python2.2及后续版本
  • **幂函数符计算乘方
  • 类似函数的可以将输入数转换为其他类型(比如long和float),他们并不完全是普通的函数而是类型对象(type object)
  • nan是一个特殊值的简写,意思是“not a number”(非数值)
  • Python语言本身就提供了对复数的支持
  • .pyw这是Windows专用的文件类型
  • strrepr和反引号是将Python值转换成字符串的三种方法:函数str让字符串更易于阅读;repr(和反引号)则将字符串转换为合法的Python表达式
  • 事实上,strintlong是一种类型,而repr仅仅是函数
  • input会假设用户输入的是合法的Python表达式;raw_input函数会把所有的输入当作原始数据
  • 长字符串,需要跨多行,可以使用三个引号代替普通引号
  • 原始字符串,以r开头,对于反斜线并不会特殊对待
  • Unicode字符串或称为Unicode对象,与字符串并不是一个类型,使用u前缀。Python3中,所有字符串都是Unicode字符串

# 二、列表和元组

  • 元组除了不能更改之外,其他性质和列表都很相似
  • python包含中内建的序列:列表、元组、字符串、Unicode字符串、buffer对象和xrange对象
  • 使用加运算符可以进行序列的连接操作,使用数字乘一个序列则原来的序列会重复多次
  • list根据字符串创建列表,join可以将一个由字符组成的列表转换成字符串
  • 分片赋值操作
  • 连接操作的效率会比extend方法低
  • sort方法用于在原位置对列表进行排序(会改变原列表),sorted方法获取已排序的列表副本
  • 实现包括一个值的元组,实现方法必须加个逗号,即使只有一个值

# 三、使用字符串

  • 字符串是不可变的,分片赋值是不合法的
  • 格式化字符串中的%S部分称为转换说明符,要在格式化字符串中包括百分号,必须使用%%
  • 在字段宽度和精度值之前还可以放置一个“标志”,该标志可以是零、加号、减号或空格
  • 零表示用0来填充,减号用来做对齐数值,空白表示在正数前加上空格,加号表示不管正数还是负数都标识出符号
  • locale模块中有一些国际化相关的功能

# 四、字典:当索引不好用时

  • 字典的值并没有特殊的顺序,都存储在一个特定的键下,键可以是数字、字符串或元组
  • 电话号码(以及其他可能以0开头的数字)应该表示为数字字符串,而不是整数
  • 表达式k in d(d为字典)查找的是键,而不是值;表达式v in l(l为列表)则用来查找值,而不是索引
  • 字典的get方法访问一个不存在的键时,可以自定义“默认值”

# 五、条件、循环和其他语句

  • 更加深入学习时你会发现:有些自以为已经掌握的知识点,还隐藏着一些让人惊讶的特性
  • 在python3.0中,print不再是语句,而是函数
  • print在结尾处加上逗号,那么接下来的语句会与前一条语句在同一行打印
  • 序列解包或递归解包 x, y = 1, 2;所解包的序列中的元素数量必须和防止在赋值赋好=左边的变量数量完全一致
  • Python3.0有另外一个解包的特性 a, b, *rest = [1, 2, 3, 4]
  • 下面的值会被解释器看作假(False): False、None、0、""、()、[]、{}
  • 上面的这些值尽管都是假值,但他们并不是相等的 []!=""
  • x<>y这样的表达式,意思其实就是x!=y,现在不建议使用<>运算符
  • ==是相等运算符(仅判断值是否相等),is是同一性运算符(判断是否同一个对象)
  • 可以使用连接比较 1<=number<=10
  • assert可以在程序中置入检查点,确保程序中的某个条件一定为真才能让程序正常工作
  • 如果能使用for循环,就尽量不要用while循环
  • zip函数可以用来并行迭代,zip可以处理不等长的序列,最短的序列用完后停止
  • 列表推导式:[x*x for x in range(10) if x % 3 == 0]
  • 使用普通的圆括号而不是方括号不会得到"元组推导式"
  • del删除的只是名称,而不是列表本身。事实上,在Python中是没有办法删除值的

# 六、抽象

  • 内建的callable函数可以用来判断函数是否可调用,在Python3.0中不再可用
  • 想要给函数写文档,可以加入注释(以#开头),另外就是直接写上字符串。内建的help函数可以得到关于函数文档字符串的信息
  • 当在序列中做切片时,返回的切片总是一个副本
  • 参数默认值(params='default'),收集其余的位置参数(*params,收集为元组),能处理关键字参数的“收集”操作(**params,收集为字典)
  • 参数变量和所对应的值用一个“不可见”的字典,内建的vars函数可以返回这个字典
  • 可以使用globals函数获取全局变量值,locals返回局部变量的字典

# 七、更加抽象

  • 日常中可能经常用复数来描述对象的类,Python中习惯上都使用单数名词且首字母大写
  • 为了让方法或者特性变为私有(从外部无法访问),只要在它的名字前面加上双下划綫即可
  • 类的内部定义中,所有以下划线开始的名字都被“翻译”成前面加上单下划线和类名的形式,所以实际上还是能在类外访问的
  • 可以使用内建的issubclass函数查看一个类是否是另一个的子类
  • 使用多重继承要特别注意超类的顺序:先继承的类中的方法会重写后继承的类中的方法
  • callable函数在Python3.0中已不再可用,可以使用hasattr(x, '__call__')来代替callable(x)
  • getattr相对应的函数是setattr,可以用来设置对象的特性

# 八、异常

  • 如果捕获到异常,但想重新引发它(也就是说要传递异常,不进行处理),那么可以调用不带参数的raise
  • except子句中忽略所有的异常类,这样可以捕获所有异常
  • 但是捕获所有异常这种是很危险的,因为他同样会捕获用户终止执行的Ctrl+C企图以及用sys.exit函数终止程序的企图等
  • 最后是finally子句,用来在可能的异常后进行清理(finally子句肯定会被执行)
  • 在Python2.5前的版本,finally子句需要独立使用,而不能作为try语句的except子句使用
  • 如果异常在函数内引发而不被处理,他就会向上传播,一直到达主程序(全局作用域),如果那里没有异常处理程序,程序会带着栈跟踪终止
  • 在很多情况下,使用try/except语句比使用if/else会更自然一些,应该养成尽可能使用try/except语句的习惯

# 九、魔法方法、属性和迭代器

  • Python中__future__这种拼写在组成的集合所包含的方法称为魔法(或特殊)方法,不要在自己的程序中使用这种名字
  • 在Python3.0中没有“旧式”的类,也不需要显式的子类化object或者将原类设置为type。所有的类都会隐式的称为object的子类
  • 只要把init方法的名字从简单的init修改为__init__即创建了一个构造方法
  • 还有一个魔法方法__del__,也就是析构方法
  • Bird.__init__(self),该方法的self参数会被自动绑定到实例上(这被称为绑定方法)
  • 当前的类和对象可以作为super函数的参数使用,调用函数返回的对象的任何方法都是调用超类的方法,而不是当前的方法
  • super函数只能在新式类中使用,super(SongBird, self).__init__()
  • isinstance函数的使用应该避免,因为类或者类型检查和Python中多态的目标背道而驰
  • 静态方法和类成员方法在创建时分别被装进staticmethod类型和classmethod类型的对象中
  • 静态方法的定义没有self参数,且直接被类本身调用,类成员方法可以直接用类的具体对象调用
  • for循环能对序列和字典进行迭代,但实际上也能对其他对象进行迭代,只要该对象实现了__iter__方法
  • 正式的说,一个实现了__iter__方法的对象是可迭代的,一个实现了next方法的对象则是迭代器
  • 从迭代器得到序列,使用list构造方法显示的将迭代器转化为列表
  • 任何包含yield语句的函数称为生成器,他不像return那样返回并终止程序,而是每次产生多个值
  • yield语句意味着生成一个值,return语句意味着生成器要停止执行(不在生成任何东西)

# 十、自带电池:模块、库

  • 告诉解释器在哪里寻找模块:sys.path.append('c:/python')
  • .pyc文件会在导入模块的时候出现,这种文件是经过编译的
  • 模块只导入一次,但也可以通过reload函数重新载入模块。Python3.0中已经去掉了reload函数
  • 在“主程序”中,变量__name__的值是__main__,为了让模块的测试代码更加好用,可以使用if __name__ == '__main__': test()
  • 为了让Pyhton将模块所在的目录作为包对待,它必须包含一个命名为__init__.py的文件
  • 模块的__all__包含一个列表,列出引入模块的所有公有方法(接口)
  • import * 语句默认将会导入模块中所有不以下划线开头的全局名称
  • 找到标准模块的位置的快捷方法是检查模块的__file__属性
  • 命令行参数会放在sys.argv列表,脚本的名字为sys.argv[0]
  • import webbrowser; webbrowser.open('http://www.baidu.com') 使用web浏览器打开网站
  • 集合本身只能包含不可变(可散列的)值,也就不能包含其他集合。集合的集合可以使用frozenset类型来实现

# 十一、文件和流

  • 使用二进制模式读写文件时,Python会鸳鸯给出文件中的内容,在文本模式下则不一定
  • 类文件对象是支持一些file类方法的对象,最重要的是支持read方法或write方法
  • 在文件中随意移动读取文职是可以的,可以使用类文件对象的方法seek和tell来直接访问感兴趣的部分(随机访问)
  • 安全的读写操作文件:try: #write data to file finally: file.close()
  • 可以使用with语句方便的完成上述操作: with open('some.text') as somefile: do_write(somefile),Python2.5中需要from __future__ import with_statement才能使用,2.5后直接使用
  • 文件写入后,不想关闭以继续使用改文件,要调用文件对象的flush方法(flush方法不允许其他程序使用改文件的同时访问文件)
  • 如果文件不是很大,可以使用不带参数的read方法一次读取整个文件,或者使用readlines方法(把文件读入一个字符串列表,在列表中每个字符串就是一行)
  • 对于非常大的文件进行行迭代的操作时,readlines会占用太多的内存,合格时候可以使用while循环和readline方法来替代
  • 文件迭代器:文件对象是可迭代的,可以直接在for循环中使用它们

# 十二、用户界面编程

  • 最成熟的跨平台Python GUI工具包-wxPython,流行的还有:Tkinter、PythonWin、Java Swing、PyGTK、PyQt
  • 在wx内进行布局的最简单方法是使用尺寸器(sizer),最容易使用的工具就是BoxSizer
  • wxPython中事件处理函数使用Bind方法添加到组件上

# 十三、数据库支持

  • 任何支持2.0版本dDB API的数据库模块都必须定义3个描述模块特征的全局变量
  • apilevel 所使用的Python DB API版本;threeadsafey 模块的线程安全等级; paramstyle 在SQL查询中使用的参数风格

# 十四、网络编程

  • 少数几个网络设计模块:socket模块、urllib和urllib2模块
  • Twisted非常丰富的框架,并且支持web服务器、客户机、SSH2,、SMTP、POP3、IMAP4、AIM、ICQ、IRC、MSN、Jabber、NNTP和DNS等
  • SocketServer框架是一个同步的网络服务器基类
  • select和poll能为通过时间片轮转来为几个连接提供服务,看起来就像是同时处理几个连接

# 十五、Python和Web

  • 屏幕抓取:程序下载网页并且从中提取信息的过程
  • 使用程序调用Tidy(Python库),进行XHTML解析;使用Beautiful Soup库专门为屏幕抓取设计
  • CGI: 通用网关接口(Common Gateway Interface)
  • RPC:远程过程调用通常会用来和网络程序设计中
  • REST:使用得最多、最简单、最优雅的格式JSON
  • SOAP:使用XML和HTTP作为底层技术的信息交换协议,支持远程调用过程,异步的,支持与路由有关的元请求
  • mod_python:包括CGI处理程序、PSP处理程序和发布处理程序

# 十六、测试

  • 代码分析器:PyChecker和PyLint
  • 测试步骤:指出需要的新特性、编写特性的骨架代码、为特性的骨架编写哑代码、重构完善代码
  • 标准库中的两个模块:unittest和doctest可以协助自动完成测试过程
  • 从doctest中运行testmod函数(用于测试模块),它会检查模块的文档字符串以及函数的文档字符串
  • doctest是简单易用的,unittest(基于Java的流行测试框架JUnit)则更加灵活和强大
  • unittest模块会区分由异常引发的错误(error)和调用failUnless等函数而导致的失败(failure)
  • 探索程序:单元测试以外的内容(源代码检查和性能分析)
  • 使用PyChecker和PyLint检查源代码
  • KISS原则:Keep It Small and Simple(让它小且简单);YAGNI原则:You Ain’t Gonna Need It(并不需要它)
  • 测试驱动编程:先测试,后编码

# 十七、扩展 Python

  • python扩展主要两个用途:使用现有的代码(老代码),或者提高瓶颈的速度
  • 扩展这些Python实现很容易,只要把扩展内容作为在基础实现中的一个库(java对应Jython,C#和其他的.NET语言对应IronPython)并且能立即在Python中使用扩展代码
  • SWIG自动为C语言库生成包装代码的工具,封装的代码会处理Python C的API,这是最简单最流行扩展Python的方法

# 十八、程序打包

  • 着重介绍Distutils,因为它是每个Python程序员工具包内的基础工具
  • py2exe作为Distutils的扩展可用来生成可执行的windows程序(.exe程序)

# 十九、好玩的编程

  • 灵活性的实现包括很多方面(原型设计、配置、自动化测试)
  • 任何时候重项目代码还是要尽量避免的
  • 为自己使用方便提取常量是一码事,还要考虑有些常量是要公开给用户的
  • 配置的级别(后面会覆盖前面的):配置文件、环境变量(可以用os.environ目录获得)、在命令行传递到程序开关和参数

# 参考