Python 初学者的困惑之一就是——我应该学习 Python2 还是 Python3,听上去很可笑,但是的确如此——身边真的有同学因为 Python 有长期支持的两个版本而不知所措……
当然是学习 Python3,但是也需要了解 Python2——去阅读一些历史遗留代码。其实这两者的区别并不大,学会了 Python3,只需要注意一些细节或者在需要时查看一下相关文档就很快能上手 Python2 的代码。
这本书实在是啰嗦而非详细,不推荐这本书。
动物出版社的《Python 学习手册》并不是一本广受推荐的 Python 学习书籍——因为它介绍了 Python2/3 中的不同,并将 Python 与许多其他编程语言比较,显得过于啰嗦,中文版有一千多页。不过如果有编程基础,其实能浏览得很快,比较集中地获取到 Python 文档中不够集中详尽的基础知识。
介绍 Python 对象类型
Python 中各种类型的简介。
Python 是动态类型——它自动跟踪变量类型而不要求声明类型(实际上,如果你像大多数的语言中 int i = 0
专门声明变量的语言,Python 会报错)。但 Python 也是强类型语言——只能对一个对象进行适合该类型的有效的操作。一旦创建了一个对象,它就和操作集合绑定了。
数字
math
模块中包含一些常用的数学工具
|
|
random
模块可以作为随机数字的生成器和随机选择器(从 Python 列表中选择)
|
|
访问序列时,负的索引号会简单地与长度相加——就是这样实现逆序访问的。
字符串
|
|
从 Python2.6 和 Python3.0 开始支持格式化的高级替换操作:
|
|
寻求帮助
可用作多种类型的通用型操作都是以内置函数存在,例如 Python3 内置函数。但是类型特定的操作是以方法调用的形式出现的,例如 aString.upper()
。
help()
和 dir()
是寻求帮助的好方法。
|
|
列表解析式
实际中的列表解析式可能会更复杂。
|
|
在 Python3.0 之后,列表、集合、字典都可以用解析创建。
|
|
列表解析和相关函数工具,如 map
和 filter
,通常运行得比 for
循环快。
数字
random
模块十分重要。
|
|
设置全局精度
decimal
对于货币运算的应用程序十分重要。
设置全局的默认精度:
|
|
设置临时精度
|
|
分数类型
明确地保留了一个分子和一个分母,从而避免了了浮点数字的不精确性。分数对象也可以从浮点字符串来创建。分数保持精确性,并自动简化结果。
|
|
集合
|
|
除了表达式,Python 还提供了相应的方法。
|
|
注意,在 Python 中,{}
仍然是一个字典。空的集合必须通过内置函数 set()
创建。
|
|
集合只能包含不可变的(可散列的)对象类型。因此,列表和字典是不可以嵌入集合的,元组则可以,但是如果元组中嵌套了列表这种可变的对象类型,则不可以。
|
|
一些较为实际的例子:
|
|
动态类型简介
Python 中的类型是和对象相关联的,而不是和变量相关联的。
字符串
|
|
replace()
方法实际上产生了一个新的字符串对象。如果需要对一个很长的字符串多处进行修改,为了优化脚本的性能,将字符串转换成支持原地修改的对象,比如列表,再用 ''.join(L)
一次性连接字符。
|
|
格式化字符串
转换目标的通用结构:
|
|
实例:
|
|
如果再运行时,才知道大小,可以用 *
来制定通过计算得出 width
和 precision
,比如这里的 4
即为指定的精度:
|
|
基于字典的字符串格式化
生成 HTML 或 XML 的程序中经常用到这一技巧。
|
|
这样的技巧也经常配合内置函数 vars()
使用,该函数返回的字典包含了所有在本函数调用时存在的所有变量:
|
|
字符串格式化调用方法
|
|
列表
列表解析式
与 map()
函数有类似的功能,但它对序列中的各项应用一个函数,并把结果放在一个新列表中。
|
|
索引和分片的赋值
均为原地修改,没有生成新的列表。
列表方法调用
L.append(x)
是将单个元素加到列表的最后,原地修改。L+[X]
是将后一个列表合并到第一个列表中,生成一个新列表。
sort()
原地排序,返回值为 None
。
|
|
有返回值的排序函数 sorted()
,可以排序任意 collection
。
|
|
reverse()
可以原地反转列表,reversed()
可以像 sorted()
一样工作,但是必须包装在一个 list()
调用中,因为它是一个迭代器。
|
|
字典
对于 pop()
方法,列表是根据位置返回值,而字典根据键来返回。get()
方法是最简洁的防止键不存在而导致异常的方法。
|
|
字典用于稀疏数据结构
|
|
字典解析
zip()
函数
|
|
字典视图
由于字典的键(字典的值不是)是不可变且唯一的,类似于集合,且支持集合的交并补等常见操作:
|
|
元组、文件及其他
概览
|
|
元组的特殊语法:逗号和圆括号
|
|
元组的不可变性只适合元组本身顶层,而非其内容。元组内部的列表是可以修改的。
文件
如果想要一行一行地扫描一个文件,文本迭代器往往是最好的选择。
|
|
用工具将文件中字符串转换成 Python 中的对象
|
|
把文本中的字符串转换成 Python 中的对象:
对第一行的字符串,只需要用 rstrip()
去掉多余的行终止符即可,line[:-1]
也可以,但是要确定每一行最后都有 \n
(可能最后一行没有 \n
)。对于第二行的数字,用索引、分片和类型转换函数(会忽略数字旁边的空白)。对于最后一行,用强大的 eval()
函数,它会将参数当成 Python 语句来执行,返回执行结果。只要有相应权限,这一方法甚至能删除计算机上的所有文件。
|
|