第一章、Python对象
1.1、Python对象
Python使用对象模型来存储数据。
所有的Python对象都有三个特性:身份、类型和值。
身份可以使用内建函数id()得到;类型可以使用内建函数type()查看。
1.2、标准类型
- 数字
- 整形 Integer
- 布尔型 Boolean
- 长整形 Long integer
- 浮点型 Floating point real number
- 复数型 Complex number
- 字符串 String
- 列表 List
- 元组 Tuple
- 字典 Dictionary
1.3、其他内建类型
- 类型
- Null 对象
- 文件
- 集合/固定集合
- 函数/方法
- 模块
- 类
1.3.1 类型对象和type类型对象
例如
>>> type(21)
<type 'int'>
1.3.2 None Python的None对象
None不支持任何运算也没有任何内建方法。
所有标准对象均可用于布尔测试,同类型的对象可以比较大小。每个对象天生具有布尔值。
下列对象的布尔值是False。
* None
* False(布尔类型)
* 所有值为0的数
* 空字符串””
* 空列表 []
* 空元组 ()
* 空字典 {}
1.4、内部类型
- 代码
- 帧
- 跟踪记录
- 切片
- 省略
- Xrange
注:异常是用类来实现的
1.4.1、代码对象
代码对象是编译过的python源代码片段,是可执行对象。
通过调用compile()可以得到代码对象。
代码对象可以被exec命令或eval()内建函数来执行。
1.4.2 帧对象
帧对象表示python的执行栈帧。
帧对象包含python解释器在运行时所需要知道的所有信息。它的属性包括指向上一帧的链接,正在被执行的代码,本地及全局名称空间字典及当前指令等。
每次函数调用产生一个新的帧,每一个帧对象都会相应创建一个C栈帧。
用到帧对象的一个地方是跟踪记录对象。
1.4.3 跟踪记录对象
代码出错时,python会引发一个异常。
如果异常未被捕获和处理,解释器会退出脚本运行,显示诊断信息。
Traceback (innermost last):
File "<stdin>", Line N? in ???
ErrorName: error reason
异常发生时,一个包含针对异常的栈跟踪信息的跟踪记录对象被创建。
如果有异常处理程序,处理程序就可以访问这个跟踪记录。
1.4.4、切片对象
切片语法:
* seqnence[start1:end1, start2:end2]
* sequence[…, start1:end1]
* slice() 内建函数
* sequence[start:end:步进值] 步进切片
>>> foostr = 'abcde'
>>> foostr[::-1]
'edcba'
>>> foostr[::-2]
'eca'
>>> foolist = [123, 'xba', 342.23, 'abc']
>>> foolist[::-1]
['abc', 342.23, 'xba', 123]
1.4.5 省略对象
省略对象用于扩展切片中,起记号作用。
这个对象在切片语法中表示省略号。类似于Null对None,省略对象有一个唯一的名字Ellipsis,它的布尔值始终为True。
>>> print(...)
Ellipsis
1.4.6、XRange对象
内建函数xrange()会产生一个Xrange对象。
时range()函数的兄弟版本。
1.5、标准类型操作符
5.1、对象值的比较
所有的内建类型均支持比较运算。
1.5.2、对象身份比较
python提供了is和is not操作符来测试两个变量是否指向同一个对象。
a is b
id(a) == id(b) #两个表达式的意义相同
注:整形对象和字符串对象是不可变对象,所以python会缓存它们。
>>> a = 1
>>> id(a)
1234567
>>> b = 1
>>> id(b)
1234567
>>> c = 1.0
>>> id(c)
2345678
>>> d = 1.0
>>> id(d)
2345689
另外字符串似乎不会缓存,此处待验证。
1.5.3 布尔类型
布尔逻辑操作符 and or not。
三个操作符中not的优先级最高。
1.6、标准类型内建函数
- cmp()
- type()
- str() repr()
<ul><li>str()和repr()或反引号操作符(
- ininstance()
- …
1.7、类型工厂函数
所有的内建函数如今都是类。
在此基础上,原来的内建转换函数如int()、type()、list()等,都成了工厂函数。
意即虽然看上去像函数,实质上是类。
调用它们时,实际上生成了该类型的一个实例,就像工厂生产货物一样。
例如
* int() long() float() complex()
* str() unicode() basestring()
* list() tuple()
* type()
* dict()
* bool()
* set() fronzenset()
* object()
* classmethod()
* staticmethod90
* super()
* property()
* file()1.8、标准类型的分类
数据类型 存储模型 更新模型 访问模型 数字 标量 不可更改 直接访问 字符串 标量 不可更改 顺序访问 列表 容器 可更改 顺序访问 元组 容器 不可更改 顺序访问 字典 容器 可更改 映射访问 1.9、不支持的类型
- byte char
- 指针
- int vs short vs long
- 实际上python的整形相当于C语言的长整形
- float vs double
- python的float实际相当于双精度类型
第二章、数字
2.1、简介
删除数字对象
del i del a, b, c
2.1.1、复数
real+imagj
复数的内建属性属性 描述 num.real 实部 num.imag 虚部 num.conjugate() 共轭复数 2.1.2、除法
地板除
>>> 1 // 2 0 >>> -1 // 2 -1
2.1.3、取余
x-(math.floor(x/y)*y)
对于复数,取余仅取其实数部分。
2.1.4、幂运算
a ** b
2.2、内建函数与工厂函数
功能函数
* abs()
* corece()
* 数据类型转换
* divmod()
* 将除法与取余运算结合,返回一个包含商和余数的元组。
* 对复数来说,商部分返回ath.floor((num1/num2).real)
* pow()
* round()
* 按四舍五入进行取整2.3、相关模块
模块 介绍 decimal 十进制浮点数运算类Decimal array 高效数值数组(字符、整型、浮点型等) math/cmath 标准C库数学运算函数。常规运算在math模块,复数运算在cmath模块 operator 数字操作符的函数实现。如 tor.sub(m,n)
等价于m-n
random 多种伪随机数生成器 另外还有著名的第三方包,如
scipy。|random模块常用函数|介绍|
|randint()|两个整型参数,返回二者之间的随机整型|
|randrange()|接受同range()同样的参数,随即返回range([start],stop,[step])结果的一项|
|uniform()|同randint(),但是返回的时浮点型|
|random()|类似于uniform(),只是下限恒等于0.0,上限恒为1.0|
|choice()|随机返回给定序列的一个元素|
第三章序列
序列包括字符串、列表、元组。
第四章、映射和集合类型
4.1、映射类型:字典
字典是python语言中唯一的映射类型。
第五章、条件和集合
第六章、文件输入和输出
第七章、错误和异常
第八章、函数和函数式编程
第九章、模块
第十章、面向对象编程
第十一章、执行环境
第十二章、正则表达式
12.1、引言
正则表达式(RE)
12.2、正则表达式使用的符号和字符
记号 说明 示例 literal 匹配字符串的值 foo re1|re2 匹配正则表达式re1或者re2 foo|bar . 匹配任何字符(换行符除外) b.b ^ 匹配字符串的开始 ^Dear |匹配字符串的结尾|/bin/∗sh | 匹 配 字 符 串 的 结 尾 | / b i n / ∗ s h * 匹配前面出现的正则表达式零次或n次 [A-Za-z0-9]* + 匹配前面出现的正则表达式一次或多次 [a-z]+\.com ? 匹配前面出现的正则表达式零次或一次 goo? {N} 匹配前面出现的正则表达式N [0-9]{3} {M,N} 匹配重复出现M次到N次的正则表达撒 [0-9]{5,9} […] 匹配字符组里出现的任意一个字符 [aeiou] [..x-y..] 匹配字符x到y中的任意一个字符 [0-9],[A-Za-z] [^..] 不匹配此字符集中出现的任何一个符号,
包括某一范围内的字符[^aeiou],[^A-Za-z0-9_] (*|+|?|{})? 用于匹配上面出现的任何“非贪婪”。版本重复匹配次数符号 .*?[a-z] (…) 匹配封闭括号中正则表达式,并保存为子组 (0-9){3})?,f(oo 特殊字符 \d 匹配任何数字,和[0-9]一样(\D是\d的反义:任何非数字符) data\d+.txt \w 匹配任何数字字母符号,和[A-Za-z0-9_]相同(\W为其反义) [A-Za-z_]\w+ \s 匹配任何空白字符,和[\n\t\v\f]相同(\S为其反义) of\sthe \b 匹配任何单词边界(\B为其反义) \b\The\b \nn 匹配已保存的子组(请参考上面的正则表达式符号(…) price:\16 \c 逐一匹配特殊字符c ., \, * \A(\Z) 匹配字符串的起始(结束) \Adear 12.3、正则表达式和Python语言
12.3.1 re模块:核心函数和方法
函数/方法 描述 函数 compile(pattern, flags=0) 对正则表达式pattern进行变异,flags是可选标识符,并返回一个regex对象 re模块的函数和regex对象的方法 match(pattern, string, flags=0) 尝试用正则表达式模式pattern匹配字符串string,flags是可选的,
若匹配成功,则返回一个匹配对象,否则返回Nonesearch(pattern, string, flages=0) 搜索string中表达式模式pattern的第一次出现 findall(pattern, string[, flags]) 搜索pattern的所有出现,返回一个匹配对象的列表 fingiter(pattern, string[, flags]) 同findall(),但是返回的是迭代器 split(pattern, string, max=0) 根据pattern中的分隔符把string分割为一个列表,返回匹配成功的列表 sub(pattern, repl, string, max=0) 把string中匹配pattern的地方替换为repl,返回替换次数的数值 匹配对象的方法 group(num=0) 返回全部匹配对象 groups() 返回一个包含全部匹配的子组的元组(若没有成功,返回一个空元组) 12.3.2 搜索与匹配
即match与search函数的比较。
例如>>> m = re.match('foo', 'seafood') >>> if m is not None: m.group()
会提示没有匹配成功,因为foo虽然在字符串seafood中,但是不是对应开头。
使用search函数会匹配成功。
第十三章、网络编程
13.1、引言
13.1.1 客户端、服务器架构
服务器存在的目的是等待客户端的请求,给这些客户服务,然后再等待其他的请求。
13.2.套接字
13.2.1、套接字也被称作进程间通讯,或IPC。
套接字有两种,基于文件型的和基于网络型的。
* AF_UNIX
* AF_INET
* AF_NETLINK
python只支持AF_UNIX,AF_NETLINK,AF_INET13.2.2、套接字地址
端口号范围是0-65535.
可以通话/etc/services文件获得保留的端口号。13.2.3、面向连接和无连接
13.1、面向连接
主要协议是传输控制协议(即TCP)。
13.2、无连接
协议是用户数据报协议(即UDP)。
13.3、网络编程
使用socket模块。
13.3.1、socket()模块函数
socket(socket_family, socket_type, protocol=0)
例如,创建一个TCP/IP的套接字,
tcpSock = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
若创建一个基于UDP/IP的套接字,
udpSock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
13.3.2套接字对象方法
函数 描述 服务器端套接字函数 s.bind() 绑定地址到套接字 s.listen() 开始TCP监听 s.accept() 被动接受TCP客户端连接,(阻塞式)等待连接的到来 客户端套接字函数 s.connect 主动初始化TCP数据 s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常 公共用途的套接字函数 s.recv() 接收TCP数据 s.send() 发送TCP数据 s.sendall() 完整发送TCP数据 s.recvfrom() 接收UDP数据 s.sendto() 发送UDP数据 s.getpeername() 连接到当前套接字的远端的地址 s.getsocketname() 当前套接字的地址 s.getsocketopt() 返回指定套接字的参数 s.setsocketopt() 设置指定套接字的参数 s.close() 关闭套接字 面向模块的套接字 s.setblocking() 设置套接字的阻塞与非阻塞模式 s.settimeout() 设置阻塞套接字操作的超时时间 s.gettimeout() 得到阻塞套接字操作的超时时间 面向文件的套接字函数 s.fileno() 套接字的文件描述符 s.makefile() 创建一个与该套接字关联的文件对象 13.3.3、创建一个TCP服务器
示例如下。
ss = socket() # 创建服务器套接字 ss.bind() # 把地址绑定到套接字上 ss.listen() # 监听连接 inf_loop: # 服务器无限循环 cs = ss.accept() # 接受客户端连接 comm_loop: # 通信循环 cs.recv()/cs.send() # 对话 cs.close # 关闭客户端套接字 ss.close # 关闭服务器套接字
所有的套接字都用socket.socker()函数来创建。
服务器需要“坐在某个端口上“等待请求。所以它们必须绑定到一个bending的地址上。
由于HOST变量设为空,表示bind()函数可以绑定在所有有效的地址上。
13.3.4、创建TCP客户端
cs = socket() # 创建客户端套接字 cs.connect() # 尝试连接服务器 comm_loop: # 通信循环 cs.send()/cs.recv() # 对话 cs.close() # 关闭客户端套接字
13.3.5、运行客户端与服务器
先运行服务器端。
13.3.6、创建一个UDP服务器
ss = socket ss.bind() inf_loop: cs = ss.recvfrom()/ss.sendto() ss.close()
13.3.7、创建一个UDP客户端
13.3.8、执行客户端和服务器
13.3.9、Socket模块属性
13.4、SocketServer属性
13.5、Twisted框架
第十四章、网络客户端编程
第十五章、多线程编程
第十六章、图形用户界面编程
第十七章、Web编程
第十八章、数据库编程
第十九章、扩展Python
第二十章、其他
未完待续。。。