导图社区 Python基础知识大全
Python由荷兰数学和计算机科学研究学会的Guido van Rossum 于1990 年代初设计,作为一门叫做ABC语言的替代品。 Python提供了高效的高级数据结构,还能简单有效地面向对象编程。
编辑于2021-08-05 09:23:59基本环境
虚拟机
字节码(Byte Code)
问题
效率低
解决
PyPy
内置JIT
类型和对象
一切皆对象
每个对象包含一个标准头
通过头部信息知道类型
头信息
引用计数
增加
引用
减少
超过作用域
手工释放
回收
等于0时
某些被缓存的对象永远不会为0
sys
getsizeof(x)
getrefcount(x)
类型指针
指向具体的类型对象
继承关系
静态成员
……
types
type(x)
x.__class__
id(x)
元素项数量
变长对象
long
str
list
……
名字空间
名字(变量)
实际为字符串对象
{name: object}
分类
globals
模块名字空间
locals
函数堆栈帧名字空间
函数外部与globals相同
函数内部获取当前函数堆栈帧名字空间
函数参数
局部变量
……
class
instance
Name have no type, but objects do
内存管理
内存池
目的
减少操作系统内存分配和回收操作
>256字节的对象,直接malloc在堆上分配
实现
虚拟机每次从OS申请一块256KB内存
取名arena
堆上分配
按系统页大小划分成多个pool
每个pool分割成n个大小相同的block
最小存储单位
8的倍数
用头信息和链表管理,以便快速查找空闲区域
arena超过64MB,则不再请求新的arena
空闲arena会被释放,内存还给OS
引用传递
对象通过复制指针实现多个名字指向同一对象
不可变类型
int,long
str
tuple,frozenset
复制
使用copy库
浅拷贝:copy
深拷贝:deepcopy
序列化对象,如pickle,cPickle,marshal
引用计数
为0时回收
将对应block标记空闲
或返回OS
弱引用
目的
不增加引用计数
不妨碍对象回收
间接引用对象
适用范围
list、dict等不适用
weakref
weakref.ref(a, callback)
注意
小整数[-5,257)由于缓存,计数不会为0
进程结束时释放
循环引用会造成计数故障
容器类对象
垃圾回收
Reference Cycle Garbage Collection
库
import gc
禁用/启用
gc.disable()
gc.enable()
gc.isenabled()
代龄
3级
GEN0
新加入的对象
GEN1
在上次回收仍存活的对象
GEN2
生命周期极长的对象
每个代龄有阈值,超过引发回收
阈值与计数
gc.get_threshold()
gc.get_count()
手动
gc.collect()
注意
如果有__del__,则永远不会被GC回收
编译
字节码
指令集没有寄存器
以栈(抽象层面)进行指令计算
文件
pyc
pyo
优化后的pyc
PyCodeObject
编译
compile
py_compile
compileall
执行
eval
exec
exec str in ns
表达式
句法规则
源文件编码
# -*- coding: utf-8 -*-
# coding=utf-8
强制缩进
防止格式丢失
在block尾部添加#end
自定义end伪关键字
__builtins__.end = None
注释
#
"""__doc___"""
语句
;
多条语句同行
\
一条语句多行
某些()、[]、{}不需\拆行
帮助
添加
"""
查看
__doc__
help()
命名规则
规则
下划线/字母开头,包括下划线/字母/数字
不能和保留字相同
区分大小写
_开头:相当于protected
__开头:相当于private
__开头和结尾是特殊成员
单独的_表示最后表达式的返回值
保留字
PEP8
http://www.python.org/dev/peps/pep-0008/
赋值
注意
除非指定global、nonlocal,否则总在当前命名空间创建或修改
不像C以block为隔离,函数内共享命名空间
支持以序列类型对多个名字赋值
值多于名字数量,会引发异常
切片
用_补位
Python3支持更好
表达式
条件判断
if/elif/else
and/or
循环分支
while
可选的else分支
for
可选的else分支
传统for循环要借助enumerate返回序号
break/continue
pass
del
生成器
注意
可以将两次比较合并成一个表达式
1 < x <= 5
条件表达式不能包含赋值语句
运算符
优先级
切片
布尔
短路
and/or实现?:
or提供默认值
相等
==
不适合判断两个名字指向同一对象
类型转换
str
int
bin
oct
hex
float
ord
chr
unichr
常用函数
2.X为表达式,3.X为函数
pprint.pprint得到更漂亮结果
input
input将输入的字符串进行eval处理
raw_input直接返回用户输入的原始字符串
getpass输入密码
exit
exit([status])
情况
status=None表示正常退出,ExitCode=0
status=<number>,ExitCode=<number>
返回非数字表示失败,参数会被显示,ExitCode=1
sys.exit()和exit完全相同
os._exit()直接终止进程,不调用退出函数,且退出码必须为数字
vars
获取locals或指定对象的命名空间
dir
获取locals中所有名字
或指定对象所有可访问成员
函数
创建
分类
def
lambda
注意
函数在同一范围内不能重载
函数总是有返回值
未指定时为None
支持递归调用,但不进行尾递归优化
最大深度sys.getrecursionlimit()
参数
位置
按位置传参
按命名传参
默认值
默认值对象在创建函数时生成,所有调用使用同一对象
若为可变类型,则为静态局部变量
默认参数后,只能有变参
变长参数
*args收集多余的位置参数
展开序列类型或字典的键
**kwargs收集额外的命名参数
展开字典键值对
lambda也支持
作用域
函数形参和内部变量存储在locals名字空间
名字查找顺序
LEGB
locals
enclosing function
globals
__builtins__
关键字
globals
修改globals名字空间
nonlocal
Python3
修改外部嵌套函数名字空间
闭包
含义
函数离开创建环境后,依然持有其上下文状态
func_closure
func_code
co_cellvars
被内部函数引用的名字列表
co_freevars
当前函数引用外部的名字列表
注意
延迟获取现象
堆栈帧
对X86的模拟
获取
sys._getframe(0)
0:当前函数
1:上个函数
inspect.currentframe()
权限管理
上下文
inspect.stack比frame.f_back更方便一些
虚拟机会缓存200个堆栈帧复用对象
包装
functools.partial()
类
名字空间
类和实例各自拥有自己的名字空间
注意对象成员和普通名字的区别
字段
注意
字段(filed)不同于属性(property)
存储
实例字段存储在instance.__dict__,代表单个对象实体的状态
静态字段存储在class.__dict__,为所有同类型实例共享
必须通过类型和实例对象才能访问字段
以双下划线开头的成员视为私有,会被重命名
_<class>__<name>
属性
概念
由getter、setter、deleter构成的逻辑
可能直接返回字段值,或动态逻辑运算的结果
实现
装饰器
@property
@<name>.setter
@<name>.deleter
描述符
name = property(get_name, set_name, del_name, "help...")
使用lambda更简洁
lambda不能使用赋值语句,改用setattr
注意别用会被重命名的私有字段名作参数
属性总是比同名实例字段优先查找
方法
与函数区别
静态方法
使用装饰器
@staticmethod
没有隐式参数
类和实例均可调用
@classmethod
绑定了类型对象作为隐式参数
类和实例均可调用
特殊方法
__new__:创建对象实例
不同的返回类型会导致__init__不被调用
__init__:初始化对象状态
__del__:对象回收前被调用
重载
不支持
继承
基类/子类/实例查询
__base__
只读,总是返回__bases__[0]
__subclass__
issubclass()
isinstance()
多重继承
顺序(mro)
从下到上
从左到右
__mro__
super
起到其他语言base的作用
不建议用self.__class__代替当前类型名
__bases__
基类列表
可直接修改更换基类,影响mro顺序
抽象类
特点
无法实例化
派生类必须完整实现所有抽象成员才可创建实例
__metaclass__ = ABCMeta
抽象方法
@abstractmethod
抽象属性
name = abstractproperty()
开放类
特点
运行期也可随意改动对象,增加/删除成员
使用
放到class.__dict__
User.print_id = print_id
内置函数
hasattr
getattr
setattr
delattr
__slots__
作用
阻止虚拟机创建实例__dict__
仅为名单中的指定成员分配内存空间
目的
减少内存占用
尤其在需要大量此类对象时提升执行性能
注意
可以用dir()和inspect.getmember()获取实例成员信息
其派生类同样必须用__slots__为新增字段分配存储空间
可以为[]
否则会创建__dict__
操作符重载
__setitem__
索引器
像序列/字典那样操作对象
其他
__getitem__
__delitem__
__contains__
__call__
像函数一样调用对象
可以把对象实例伪装成函数接口
__dir__
配合__slots__隐藏内部成员
必须返回list,而不是tuple
attr相关
方法
__getattr__
访问不存在的成员
__setattr__
对任何成员赋值
__delattr__
删除成员
__getattribute__
访问任何存在/不存在的成员,包括__dict__
注意
不要在这几个方法内直接访问对象成员
不要用hasattr/getattr/setattr/delattr函数
应直接操作__dict__
__getattribute__只能用基类的__getattribute__返回结果
比较
__cmp__
返回数字判断大小
__eq__
相等判断
元类
基础
New-style Class的默认元类是type
关键字class会被编译成元类创建类型对象指令
class和def是指令,所以可以在任何地方创建类型对象
__metaclass__
作用
自定义元类
自定义元类
从 type继承
习惯以Meta结尾
注意__new__和__init__方法参数的区别
顺序
class.__metaclass__
bases.__metaclass__
module.__metaclass__
type
其他
惯例将元类写成type的派生类,但可用函数代替
magic
当控制了类型对象的创建,意味着可以让对象的实际行为和代码存在极大差异
例程
静态类(不允许创建实例)
通常作为工具类存在
密封类(禁止被继承)
模块
模块对象
属性
__name__:模块名
sys.modules中以此为主键
__file__:模块完整文件名
__dict__:模块globals名字空间
创建
py文件
动态
type.ModuleType
imp.new_module
不会添加到sys.modules
reload
目的
重新导入模块
搜索路径
模块/包搜索顺序
当前进程根目录
PYTHONPATH环境变量指定的路径列表
Python标准库目录列表
路径文件.pth保存的目录(通常在site-packages目录下)
虚拟机匹配顺序
py源码文件
pyc字节码文件
egg包文件或目录
so、dll、pyd等扩展文件
内置模块
其他
imp.find_module()
导入模块
__all__
指定可被批量导出的成员名单
__import__
以字符串为参数导入模块
导入的模块
会被添加到sys.modules
不会在当前名字空间创建引用
导入pachage.module时,返回的是package
formlist不为空时,才返回目标模块
建议使用importlib.import_module()代替
优先查找进程根目录,而非当前目录
load_source
载入不在sys.path搜索路径列表中的模块文件
优先使用字节码文件
注意
每次都会新建模块对象
构建包
包
多个模块放在独立目录下,并提供__init__.py
__all__
from <package> import *仅导入__init__.py的名字空间
__init__.py
一般为空,即什么都没导入
需要用__all__指定可以被导入的模块名子列表
__path__
情景
包内文件多,需分类到多个目录,但不想拆分包
__init__.py
__path__指定所有子目录的全路径(可在包外)
pkgutil
目的
获取包里面的所有模块列表
iter_modules()与walk_packages()
后者迭代所有深度的子包
pkgutil.get_data()读取包内任何文件内容
egg
目的
将包压缩成单个文件,便于分发和安装
流程
安装
setuptools
创建空目录,将包目录完整拷贝到该目录下
创建setup.py
http://docs.python.org/2/distutils/setupscript.html
创建egg压缩文件
生成的egg文件在dist目录
使用
将egg文件全路径添加到.pth或PYTHONPATH
安装到site_packages目录
标准库
字符串
re
函数
match
匹配字符串开始位置
search
扫描字符串,找到第一个位置
findall
找到全部匹配,列表返回
finditer
找到全部匹配,迭代器返回
MatchObject
group
返回匹配的完整字符串
start
匹配开始位置
可接受分组序号
0表示整体匹配结果
end
匹配结束位置
可接受分组序号
0表示整体匹配结果
span
开始/结束位置元组
可接受分组序号
0表示整体匹配结果
groups
返回分组信息
groupdict
返回命名分析信息
group
返回指定序号的分组
可接受多个参数
0表示整体匹配结果
编译标志
s
单行
i
忽略大小写
L
让\w匹配当地字符
对中文支持不好
m
多行
x
忽略多余的空白字符
u
Unicode
组操作
命名组
(?P<name>...)
非捕获组
(?:...)
作为匹配条件,但不返回
反向引用
\<number>
(?P=name)
肯定顺序环视
(?=...)
组内容必须出现在右侧
否定顺序环视
(?!...)
组内容不能出现在右侧
肯定逆序环视
(?<=...)
组内容必须出现在左侧
否定逆序环视
(?<!...)
组内容不能出现在左侧
修改
split
分割
sub
替换
subn
替换
返回(新字符串,替换次数)
StringIO
作用
提供类文件接口的字符串缓冲区
from cStringIO import StringIO
struct
作用
输出二进制字节序列
可通过格式化参数,指定类型、长度、字节序、内存对齐等
方法
pack
unpack
其他输出缓冲对象
bytearray
array
ctypes.create_str_buffer
其他
calcsize
计算指定格式转换所需的字节长度
pack_info
unpack_from
数据类型
bisect
二分法在一个"已排序序列"中查找合适的插入位置
函数
bisect
查找合适的插入位置
bisect_left/bisect_right
如待查元素在列表中存在,则返回左/右侧插入位置
insort_left
直接插入元素,而非查找
用途
列表排序
Consistent Hashing
heapq
最小堆:完全平衡二叉树,所有节点都小于其子节点
堆
意义
最快找到最大/小值
在堆中插入/删除最大/小元素时重新构造时间复杂度更小
用途
算法调度
优先级调度
时间驱动调度
函数
heappush
堆是树,并非排序列表
heappop
heapify
将列表转换为堆
heappushpop
先push再pop
弹出值<=item
heapreplace
先pop,后push
弹出值可能大于item
其他
nlargest
从列表(不一定是堆)有序返回最大的n个元素
nsmallest
__cmp__
利用__cmp__,用数字表示对象优先级,实现优先级队列
数学运算
random
类
Random()
方法/函数
seed(1)
种子
randint(a, b)
生成 a <= N <= b范围内的整数
getrandbits(N)
生成最大N个二进制位的长整数
randrange(start, stop, step)
生成start <= N < stop范围内的随机整数
支持步进
choice(list)
从序列中随机返回元素
shuffle(list)
打乱序列
sample(list, N)
从序列中随机挑选N个不同元素组合成列表
random()
生成0.0 <= N < 1的随机浮点数
uniform(min, max)
生成min <= N <= max范围内的随机浮点数
三角、贝塔分布、指数分布、伽玛分布、高斯分布等专业随机算法
文件与目录
file
函数
open()
flush()
sync()
确保数据从系统缓冲区同步到磁盘
close()
总是会调用flush()和sync()
writelines()
readline()
返回包括换行符在内的整个行数据
xreadlines()/readlines()
读取整个文件
seek()
File Object
实现了上下文协议,可确保文件及时关闭
实际上,文件对象被回收时总是会调用close
打开模式
r:只读
w:只写
a:添加
b:二进制
r+:更新文件,可读写,不会截短文件
w+:更新文件,可读写,清楚原来内容
a+:更新文件,可读写,总是在尾部添加
迭代器
换行符
读:总能判断不同平台换行标记
写:需自行添加
os.linesep
binary
作用
用struct将其他类型构建成二进制字节数组
然后,写入文件
性能提升
对于同类型数据,可用array
encoding
codecs提供了一个包装版的open(),可自动完成编码转换
codecs.open("file.txt", "w", "gbk")
descriptor
操控文件描述符
函数
os.open()
os.write()
os.fdopen
通过描述符创建文件对象
os.read()
os.lseek()
os.close()
tempfile
分类
TemporaryFile
创建临时文件对象,关闭时自动删除
NamedTemporaryFile
创建临时文件对象,可获取文件名,参数决定是否自动删除
建议用
可设置prefix、suffix、dir
SpooledTemporaryFile
类似TemporaryFile,数据超过阈值时写入硬盘
函数
tempfile.gettempdir
返回系统临时文件存放路径
tempfile.gettempprefix
返回默认的临时文件名前缀
tempfile.mkdtemp
创建临时目录
tempfile.mkstemp
创建临时文件,返回描述符和文件名,需手工删除
os.tempnam
仅返回有效的临时文件名,不创建文件
os.tmpfile()
创建临时文件对象,关闭后自动删除
os.path
常用函数
例程
os
常用函数
例程
shutil
常用函数
数据存储
serialization
marshal
Python专用的序列化算法
注意
与具体的机器架构无关
可能随Python版本变化
支持
None
bool/int/long/float/complex
str/unicode
tuple/list/set/frozenset/dict
code objects/StopIteration
函数
dump
load
dumps
loads
pickle/cPickle
协议版本
0
使用可显示的ASCII字符编码,便于阅读和手工编辑
默认
1
兼容早期Python版本的二进制格式
2
最有效的二进制编码格式
支持
None/True/False
int/long/float/complex
str/unicode
tuple/list/set/dict
function
class/instance
函数
dump/load/dumps/loads
性能
cPickle比pickle有千倍提升
shevle
作用
将对象pickle序列化,然后保存到anydbm格式文件
anydbm
KV结构的数据库
其他选择
dbm
gdbm
bdb
参数
flag
r读,w写,c读写,n新建、读写
protocol
pickle版本
writeback
允许将变更的对象同步到数据库
还是显式修改保存好
数据压缩
暂无
格式解析
暂无
数据加密
暂无
OS
time
分类
绝对时间
相对时间
epoch
基准点
1970-01-01 00:00:00 UTC
UTC
协调世界时
DST
夏令时
函数
time()
返回自epoch以来的秒数
gmtime()、localtime()
epoch转为struct_time结构体
timegm()、mktime()
struct_time结构体转为epoch
ctime()
将epoch转为字符串
asctime()
将struct_time转为字符串
clock()
返回当前进程消耗的CPU时间
sleep()
暂停进程
strftime
将struct_time格式化为字符串
strptime
将字符串格式化为struct_time
timezone
与UTC时差
tzname
当前时区名称
与datetime的转换
注意
返回的是localtime
转换
datetime.fromtimestamp(t)
timetuple
threading
Thread
创建Thread实例,传入待执行函数
Thread
currentThread
activeCount
可给线程取名
可继承Thread实现自己的线程类
背景线程
daemon属性设为True
进程退出时不会等待该线程结束
join()
等待线程结束
可提供超时参数 (秒)
可多次调用
isAlive()
检查线程状态
Lock
注意
不支持递归加锁
即使同一线程,也必须等待锁释放
通常使用RLock
会处理owning thread和recursion level状态
同一线程的多次请求锁行为,只累加计数器
调用release()递减计数器,直至0释放锁
acquire()和release()必须成对出现
with lock
Event
作用
通过一个内部标记来协调多线程执行
方法
wait
阻塞线程执行,直到标记为True
set
将标记设为True
clear
将标记设为False
isSet
判断标记状态
注意
通常为每个线程准备一个独立的Event
Condition
with cond
作用
像Lock和Event的综合体
除基本的锁操作外,还提供了类似yield的功能
在获取锁之后,可调用wait()临时让出锁,当前线程阻塞,直到notify()再请求锁
将wait当作yield,notify当作send
注意
只有获取锁的线程才能调用wait和notify
notifyAll
激活所有等待线程,让他们抢锁
Semaphore
作用
通过一个计数器限制可同时运行的线程数量
函数
acquire()递减计数器
release()增加计数器
with sem
Timer
作用
用一个独立线程在n秒后执行某函数
如定时器尚未执行,可用cancel()取消
定时器仅执行一次
Local
作用
TLS为线程提供独立的存储空间
ctypes
作用
方便的调用动态库.so,解决安全和性能问题
使用
cdll.LoadLibrary("./test.so")
原书标记:待完善
进程通信
subprocess
作用
执行程序,获取返回码或输出信息
函数
call
返回ExitCode
check_all
如ExitCode != 0,抛出CalledProcessError异常
check_output
返回输出信息,ExitCode != 0抛出异常
注意
subprocess替代os.system、os.spawm、os.popen、os.popen2、commands
创建Popen对象获取更细节控制
subprocess不能控制终端和tty交互程序
进程信息可用psutil获取
第三方库
Fabric
pexpect
signal
软中断,提供异步事件通知机制
常用信号
SIGINT:<C-C>
SIGTERM:由kill()发送,进程终止
SIGCHLD:子进程终止
SIGHUP:终端会话终止
SIGSTP:<C-Z>
SIGALRM:告警
SIGKILL、SIGSTOP不能被捕获
signal
作用
仅能在主线程调用signal()注册信号处理器函数
移除当前处理动作
getsignal()获取,在需要时重新注册
特殊处理器
SIG_IGN:忽略信号
SIG_DFL:默认处理
pause
作用
使进程休眠,直到进程接收到信号
信号要么被处理,要么终止进程
alarm
作用
在n秒后发送一个SIGALRM信号
0秒取消
timer
作用
设置在n秒后发出信号,并间隔m秒重复发出
0秒清除定时器
网络编程
暂无
程序框架
cmd
作用
写出交互命令行客户端
支持常用快捷键和命令补全
shlex
作用
分割Unix Shell命令行参数的简单此法分析器
shlex.split
还原
subprocess.list2cmdline
复杂参数处理
argparse
开发工具
暂无
运行时服务
暂无
语言服务
暂无
扩展库
Fabric
作用
通过SSH进行软件部署或系统管理
设置
连接目标主机前需配置
配置
env.hosts
env.host_string
……
任务
即普通函数
执行
execute执行
命令行调用
参数
默认
所有env.hosts或host_string
主机
单主机
多主机列表
角色
单角色
多角色列表
注意
可用装饰器设置参数
显式关闭连接
颜色
上下文
区域设置
cd
切换主机目录
lcd
切换本地目录
hide
隐藏输出信息
quiet
安静模式
path
修改path环境变量
目的
切换到合适的工作目录,减少命令行输入
操作
get:下载文件
put:上传文件
run:运行远程命令
最常用
属性
succeeded
return_code
command
real_command
……
sudo:以超级用户执行命令
local:运行本地命令
prompt:用户输入
open_shell:远程交互式环境
reboot:重启
其他
fabric.utils
abort:引发异常
warn:显示警告信息,但不终止
indent:获取一个缩进字符串
fastprint,puts:显示信息
fabric.contrib.console
confirm:用户输入[Y/N]
fabric.contrib.files
append:添加信息
comment:按条件注释掉某些内容
contains:是否包含特定内容
exists:路径是否存在
问题
对后台运行命令nohup支持不好
screen、pexpecct代替
open_shell交互,<C-C>会使fabric退出,而不是远程进程
Pexpect
spawn
作用
启动子程序,判断输出,发送下一步交互指令
工作方式
创建spawn对象,启动特定命令子程序
通过expect使用RE等判断子程序输出内容,以便决定下一步操作
使用sendline发送下一步命令
循环2-3,直到结束
expect
接受列表参数
通过匹配返回其中某个序号
EOF表示终止
TIMEOUT超时
read/readline/readlines
从子程序读取输出信息
send/sendcontrol/sendeof/sendintr/sendline
可指定logfile
interact
切换为人工交互模式
run
对spawn的封装,用于执行一些简单命令,并不或输出结果
pxssh
用于ssh操作的封装类
描述符
协议
__get__(self, instance, owner) --> return value
__set__(self, instance, value)
__delete__(self, isntance)
注意
描述符对象总是依赖某个类型而存在
描述符类型至少要实现协议中的一个方法
同时提供__get__和__set__的,称为data descriptor
只提供__get__的,称为non-data descriptor
必须是owner class成员
可用owner_class或owner_instance访问
解释器自动调用对应方法
__set__和__delete__仅owner_instance访问时有效
property
属性总是data descriptor
优先级总是高于同名实例字段
如果没提供setter,__set__方法会阻止赋值操作
non-data
会被同名实例字段抢先
bound method
self隐式传递
只有bound method才会隐式传递self
unbound method需显示传递self
造成原因
bound/unbound是__get__造成的
关键是instance参数
classmethod
不同于staticmethod,classmethod会bound类型对象
内置类型
空值
None
数字
bool
False
None、0、空字符串、没有元素的容器
True
反之
int
特点
从堆上按需申请名为PyIntBlock的缓存区域存储
使用固定数组缓存[-5,257)间数字,计算下标获得指针
PyIntBlock内存不会返还OS
range
range
创建巨大的数字列表
需要足够多的PyIntBlock提供存储空间
xrange
每次迭代后回收
内存复用
long
变长对象
sys.maxint获得系统最大int
float
问题
不能“精确”表示某些十进制小数值
解决
库
decimal
complex
序列
str
特点
不可变类型
缓存机制
短字符串存在arena
str、unicode单字符永久缓存
str没有缓存机制
unicode保留1024个宽字符长度小于9的复用对象
内部含hash值
str有标记判断是否池化
定义
单引号
双引号
三引号
编码
默认
2.X:ASCII
3.X:Unicode
encode/decode
codecs模块
处理更复杂转换
format
标记
-:左对齐
+:数字符号
#:进制前缀
用0、空格填充
小数位
其他用法
命名参数
参数复用
千分位符号
左中右对齐
可指定填充字符
成员/字典/列表
模板
字母/数字表
from string import letters, digits
模板替换
from string import Template
Template("$a, $b").substitute(a = 1, b = 2)
池化(intern)
类似__name__, __doc__的名字
目的
有助于减少对象数量和内存消耗
intern(str)
池化的字符串不再有引用时被回收
unicode
list
特点
列表对象和存储元素指针的数组是分开的两块内存
虚拟机保留80个列表复用对象,但其指针数组会被释放
列表会动态调整指针数组大小,预分配多于实际元素数量
操作
创建
基本操作
bisect
向有序列表插入元素
性能
使用realloc调整大小,有性能隐患
可以考虑数组代替
import array
tuple
特点
只读对象,元组和元素指针数组内存一次性连续分配
虚拟机缓存n个元素数量小于20的元组复用对象
性能
内存复用高效
只读利于并行开发
namedtuple
用名字访问元素项
使用
from collections import namedtuple
User = namedtuple("User", "name age")
u = User("user1", 10)
u.name, u.age
利用模板动态创建的自定义类型
字典
dict
特点
自带容量8的smalltable,超出时才去堆上额外分配
虚拟机缓存80个字典复用对象,但在堆上分配的元素表内存会被释放
按需动态调整容量,重新分配内存/hash
删除元素不会立即收缩内存
操作
创建
基本操作
默认返回值
get
setdefault
迭代器
keys
values
items
对于大字典,应用iterkeys/itervalues/iteritems
视图
判断两字典差异
d.viewitems()
可以做&、|、-、^、in操作
视图会和字典同步变更
扩展
当key不存在时,defaultdict自动调用工厂对象创建所需键值对
字典是hash表,无序
有序
from collections import OrderedDict
od = OrderedDict()
集合
set
存储无序不重复对象
判重
(a is b) or (hash(a) == hash(b) and eq(a, b))
支持集合运算
注意
集合和字典的主键必须能hash
tuple、frozenset可以
如果想把自定义类型放入集合,需保证hash和equal结果相同才能去重
frozenset
只读版本的set
异常
异常
try/except/else/finally
else在没有引发异常时执行
raise
建议使用raise Exception("message")而不是raise Exception, "message"
支持在except中重新抛出异常
sys.exc_info
获取堆栈上的最后异常信息
显示异常信息
sys.excepthook(exc_type, exc_value, traceback)
警告
warnings模块
warnings.warn("msg")
注意
自定义异常通常继承自Exception,应该用具体类型表示不同的错误行为,而不是message
断言
assert 条件[, 错误信息]
条件不符时,发出AssertError异常
受只读参数__debug__控制
启动时-O使失效
上下文
作用
提供包含初始化和清理操作的安全上下文环境
即便异常,也会清理
__enter__
初始化环境,返回上下文对象
__exit__
执行清理操作
返回True时,阻止异常向外传递
with ... as ...
可以在一个with语句使用多个上下文对象
FILO
contextlib
作用
提供了一个contextmanager装饰器,简化上下文类型开发
使用
from contextlib import contextmanager
@contextmanager
用途
Synchronized
为代码块提供lock/unlock线程同步
DBContext
为代码块中的逻辑提供共享的数据库连接,并负责关闭连接
标准异常类
BaseException 所有异常的基类
SystemExit解释器请求退出
KeyboardInterrupt用户中断执行(通常是输入^C)
Exception常规错误的基类
StopIteration迭代器没有更多的值
GeneratorExit生成器(generator)发生异常来通知退出
SystemExit Python 解释器请求退出
StandardError所有的内建标准异常的基类
ArithmeticError所有数值计算错误的基类
FloatingPointError浮点计算错误
OverflowError数值运算超出最大限制
ZeroDivisionError除(或取模)零 (所有数据类型)
AssertionError断言语句失败
AttributeError对象没有这个属性
EOFError没有内建输入,到达EOF 标记
EnvironmentError操作系统错误的基类
IOError输入/输出操作失败
OSError操作系统错误
WindowsError系统调用失败
ImportError导入模块/对象失败
LookupError无效数据查询的基类
IndexError序列中没有没有此索引(index)
KeyError映射中没有这个键
MemoryError内存溢出错误(对于Python 解释器不是致命的)
NameError未声明/初始化对象 (没有属性)
UnboundLocalError访问未初始化的本地变量
ReferenceError弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError一般的运行时错误
NotImplementedError尚未实现的方法
SyntaxError Python语法错误
IndentationError缩进错误
TabError Tab 和空格混用
SystemError一般的解释器系统错误
TypeError对类型无效的操作
ValueError传入无效的参数
UnicodeError Unicode 相关的错误
UnicodeDecodeError Unicode 解码时的错误
UnicodeEncodeError Unicode 编码时错误
UnicodeTranslateError Unicode 转换时错误
Warning警告的基类
DeprecationWarning关于被弃用的特征的警告
FutureWarning关于构造将来语义会有改变的警告
OverflowWarning旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning关于特性将会被废弃的警告
RuntimeWarning可疑的运行时行为(runtime behavior)的警告
SyntaxWarning可疑的语法的警告
UserWarning用户代码生成的警告
迭代器
迭代器
方法
__iter__()
返回迭代器对象
next()
依次返回数据
做法
内置函数iter()
返回常用类型的迭代器包装对象
好处
避免对象状态被外部修改
减小内存消耗
问题
无法让迭代中途停止
设计原则
将迭代器从数据对象中分离出去
生成器
做法
用yield返回实现了迭代器协议的生成器对象
协程(coroutine)
又称纤程(fiber)
用户空间线程
自己去调度
流程
创建协程对象
使用send(None)或next()启动
协程在执行yield result后让出执行绪,等待消息
调用方发送send消息,协程恢复执行,并保存数据,执行后续内容
再次循环到yield,协程返回前面的处理结果,并在此让出执行绪
直到关闭close()或被引发异常throw()
第三方库
gevent/eventlet
greenlet
模式
生产者消费者
改进回调
blocking style
itertools模块
chain
连接多个迭代器
combinations
返回指定长度的元素顺序组合序列
combinations_with_replacement
额外返回同一元素的组合
compress
按条件表过滤迭代器元素
条件表可以是任何布尔列表
count
从起点开始,无限循环下去
cycle
迭代结束,从头再来
dropwhile
跳过头部符合条件的元素
takewhile
仅保留头部符合条件的元素
groupby
将连续出现的相同元素进行分组
ifilter
仅保留符合条件的元素
ifilterfalse
和ifilter相反
imap
与map相似
islice
以切片方法从迭代器获取元素
izip
类似zip()
要保留多余元素可用izip_longest
permutations
全排列(Arrangement)
product
每个元素都和后面的迭代器完整组合一遍
repeat
将一个对象重复n次
starmap
按顺序处理每组元素
tee
复制迭代器
装饰器
基础
作用
通过返回包装对象实现间接调用,插入额外逻辑
理解
@check_args def test(*args): print args
test = check_args(test)
装饰器
返回wrap包装对象
类,通过__call__完成目标调用
可直接返回原类型
如只增加一些额外成员时
Class
为类提供装饰器,将类型对象作为参数
替换func wrap为class wrap更好看
__new__
参数
步骤
先传参数
再送类型
嵌套
可以在同一目标上使用多个装饰器
即函数嵌套
functools.wraps
装饰器的装饰器
作用
将原函数对象的指定属性赋值给包装函数对象
默认
__module__
__name__
__doc__
可以通过参数选择
用途
AOP
身份验证
参数检查
异常日志
Proxy
对目标函数注入权限管理
Context
提供函数级别的上下文环境
Caching
检查缓存是否过期,然后决定是否调用目标函数
Metaprogramming
附录
CPython
参数
iPython
命令
备注
演示
pdb
作用
调试
命令
启动方式
pip
作用
easy_install的替代品
命令
VirtualEnv
作用
通常配合VirtualEnvWrapper使用
提供一些更易于使用的命令
命令