一、快速改造
//
双斜线执行整除,只能用在Python2.2及后续版本 **
幂函数符计算乘方 - 类似函数的可以将输入数转换为其他类型(比如long和float),他们并不完全是普通的函数而是类型对象(type object)
nan
是一个特殊值的简写,意思是“not a number”(非数值) - Python语言本身就提供了对复数的支持
.pyw
这是Windows专用的文件类型 str
、repr
和反引号是将Python值转换成字符串的三种方法:函数str
让字符串更易于阅读;repr
(和反引号)则将字符串转换为合法的Python表达式 - 事实上,
str
和int
、long
是一种类型,而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目录获得)、在命令行传递到程序开关和参数
参考