Python学习手册(第四版)
2021-10-05 23:34:18 0 举报
AI智能生成
python学习
作者其他创作
大纲/内容
表达式操作符
yield x
lambda args : expression
x if y else z
x or y
x and y
not x
x in y,x not in y
x is y, x is not y
x<y,x <=y,x>y,x>=y
x==y,x!=y
x | y
x & y
x ^ y
x << y, x>>y
x + y , x - y
x * y , x % y , x / y , x// y
-x , +x
~x
x ** y
x[i]
x[i:j:k]
x(...)
x.attr
(...)
[...]
{...}
对象分类
子主题
Python中任何东西都是对象,即便是对象的类型
拷贝
无条件的分片以及copy方法只能复制顶层对象
copy
copy
deepcopy
真假
数值0->False,1->True;其他对象 空->False 非空->True
None
对象占位符
占用实际的内存
函数的默认返回值
没有实际含义
执行模块
.pyc
字节码
pvm
冻结二进制文件
解释器
CPython
JPython
IronPython
模块
import
from module import attr
reload
dir
变量表
exec
数据类型
内置对象
数字
工具包
math
random
random
choice
复数
固定精度十进制数
有理数
矩阵
向量
字符串
字符序列
正向索引
0:N
反向索引
-1:-N
分片
子主题
+
拼接
*
重复
不可变型
数字、字符串、元组
方法
作为多种类型的通用型操作都是以函数或表达式的方式存在
特定类型特有的,都是以方法的方式存在
见帮助
格式化
子主题
帮助
子主题
模式匹配
子主题
列表
序列操作
特点
可变长
元素类型没有限制
边界检查
子主题
嵌套
子主题
列表解析
子主题
子主题
生成器
map具体同样的功能。列表、集合、字典都可以用解析来创建
字典
是映射不是序列
映射操作
可变的,无界的
嵌套
一旦一个对象的最后一次引用被移除,空间将会立即回收
不能存在判断
子主题
循环遍历
字典不是序列,但是可以迭代
元组
不可变列表
特有方法 index / count
文件
集合
数学集合运算
Booelan
内置的int子类
None
None是一个特殊的占位符对象
类型检查
类型检查破坏了代码的灵活性,我们应该编写对象接口,而不是适用于特定类型的代码,这也正是Python 的多态思想
数字
特定类型
整数和浮点数
整数无穷
int(str,base)
进制
0X
hex
0o
oct
0b
bin
格式化
复数
complex(real,imag)
cmath
固定精度的十进制数
float不能精确计算
Decimal
设置精度
有理分数
友好显示
类似于小数,通过固定小数位数和指定舍入或截断策略来控制数值精度
子主题
混合运算
集合
无值的字典的键
{...}
set(序列|可迭代对象)
x = set('abcde') y = set('bdxyz')
可迭代对象
集合中只能存储不可变对象
布尔类型
内置的整数类型int的子类
bool
无穷的整数精度
各种数字内置函数和模块
数据工具
操作符
+
-
*
/
>>
**
&
内置函数
pow
abs
round
int
hex
bin
builtin 模块
模块
random
math
数字混合运算
40 自动转化为float
转化规则
将被操作的对象转化成其中最复杂的操作对象类型
整数比浮点数简单,浮点数比复数简单
不同类型的操作数不会自动转化
运算符重载
Python中的所有操作符都可以应用于自定义类结构
格式化显示
子主题
连续操作
子主题
子主题
/ 和 //
真除法
截断除法
floor
最近整数
动态类型
变量在赋值时如果不存在才创建,它可以引用任何类型的对象,并且必须在引用之前赋值
变量名、类型、对象
类型是属于对象
每个对象都有两个头部信息
类型标识符标识这个对象的类型
类型标识符是一个指向特定类型的对象的指针
引用计数器
当对象的引用计数为0时,对象会被立即回收
子主题
Python的垃圾收集器主要是基于引用计数器,它也有一部分功能可以及时地检测并回收带有循环引用的对象
变量名没有类型
变量名只是引用对象
共享引用
不可变对象
可变对象
可变对象拷贝
相等判断
Python会缓存小的数字和短的字符串
动态类型是多态的根本
字符串
常量
‘
“
'''
转义
raw
操作
+
*
in
索引和分片
索引
X[I:J:K]
I其实索引,包含
J结束索引,不包含
K步长,为负数表示反向
字符串转化
ord
获取字符对应的ASCII码
chr
获取下一个字符
格式化
表达式格式化
子主题
子主题
子主题
字典格式化
子主题
子主题
vars()
format
类似于函数的参数,可以通过位置传递也可以通过命名传递
序列的索引只能为单个整数,否则在外层计算
格式
子主题
formatspec
列表
常量表达式以及操作
L = []
L = [0, 1, 2, 3]
L = ['abc', [1,2,3]]
L = list('spam')
L = list(range(-4,4))
L[i] L[i][j] L[i:j] L[i:j:k]
L1 + L2
L1 * 2
for x in L :print(x)
3 in L
del L[i]
del L[i:j]
L[i:j] = [1,2,3]
L = [x**2 for x in L if x%2 ==0]
方法
字典
常量表达式以及操作
D = {}
D = {'spam':2 , 'eggs': 3}
D = {'food': {'ham' : 1 , 'egg':3}}
D['eggs'] D['food']['ham']
'eggs' in D
del D[key]
D = {x: x*2 for x in range(10)}
键可以是任何不可变对象
元组
常量表达式以及操作
T = ()
T = (0, 1, 2, 3)
T = ('abc', (1,2,3))
T = tuple('spam')
L[i] L[i][j] L[i:j] L[i:j:k]
L1 + L2
L1 * 2
for x in L :print(x)
3 in L
L = [x**2 for x in L if x%2 ==0]
index
count
特殊语法
有时圆括号可以省略
文件
打开模式
r
w
a
+
b
close
虽然文件对象在没有引用时,会回收,并且调用close方法,建议手动调用close
文件类型
文本文件
str
自动执行Unicode编码和节码
二进制文件
bytes
存储对象
eval
pickle
写入
读取
struct
打包二进制文件处理
文件上下文管理器
自动关闭文件
子主题
其他文件工具
os
sys
socket
pipes
shell
...
语句
语句
子主题
子主题
语法
: {}
子主题
括号是可选的
if( x > y)
终止行就是终止语句
;
缩进的结束就是代码块的结束
同一代码块必须有相同的缩进
可读性更好
特殊语法
用分号分割一行的多个简单语句
跨行语句
子主题
单行
子主题
赋值、表达式、打印
赋值
子主题
变量
命令规则
(下划线或字母)+(任意数目的字母、数字或下划线)
命名惯例
_X
不会被 from module import * 语句导入
_X_
系统定义的变量名,对解释器有特殊意义
__X
类的本地变量
_
交互模式下运行时,保存最后表达式的结果
类名
首字母大写
模块名
首字母小写
使用之前必须赋值
不用声明
变量名只是对象的引用值,没有不可变概念,也没有相关联的类型
作用域
表达式
子主题
打印
print将对象自动转化为字符串发送给标准输出流
文件写入不会将对象自动转化为字符串
print
子主题
等价操作
print('hello world')
默认print会将输入发送给 sys.stdout对应的对象,sys.stdout 默认的对象是标准输出流
重定向输出流
如果只是临时输出到文件,记得恢复 sys.stdout
自定义输出流处理
if
复合语句结构
X if Y else Z
while 和 for
while
子主题
子主题
break
continue
pass
...
else
只有循环正常结束(没有执行break)
替代其他语言中的状态标志
子主题
子主题
for
目标
序列对象
字符串
列表
元组
可迭代对象
字典
文件
任何赋值语句的左侧部分都可以作为遍历目标,请参考赋值部分
元组解析赋值
遍历字典
序列解包
定制迭代,建议使用for,速度相对while更快
range
下界、上界(不包含)以及步长(可以是负数)
间隔元素遍历
range
分片
循环中修改列表的值
range
while
列表解析表达式
zip
1. zip返回的也是一个迭代器
2. 组成的元素对的长度有参数中最短序列决定
2. 组成的元素对的长度有参数中最短序列决定
字典
enumerate
返回生成器对象,并且每个元素包含实际的元素以及索引
enumerate 也是可以迭代的
迭代器和解析
迭代器
使用迭代协议,从左到右扫描对象的迭代工具
for循环
列表解析
in成员关系测试
map
sorted
zip
enumerate
reduce
filter
sum
any
all
max
min
list
子主题
zip返回的是对象自身是迭代器,并且注意 list(z) 的返回值
tuple
...
迭代协议
for循环首先将循环对象传递给 iter方法,返回该对象的迭代器,
然后每次迭代调用next方法,而且会捕获 StopIteration异常,
从而停止循环
然后每次迭代调用next方法,而且会捕获 StopIteration异常,
从而停止循环
有的对象自身就是迭代器,如file
有的对象可能会有多个迭代器,所以自身不是迭代器,如列表
具有 __next__ 方法
next(可迭代对象)
迭代结束会抛出 StopIteration
手动迭代
序列也是可迭代对象
大多数的迭代方法返回的都是可迭代对象,而不是列表,这样的延迟计算对内存更友好,如 map filter等等
类型
单个迭代器
自身就是迭代器
zip返回的是对象自身是迭代器,并且注意 list(z) 的返回值
多个迭代器
调用iter返回迭代器
range自身不是迭代器
生成器
生成器函数
状态挂起
定义生成器函数
手动迭代返回值
yield
特殊编译,执行时返回一个迭代器对象
扩展生成器协议
提供了调用者与生成器之间的通信方式
生成器表达式
类似于列表解析
可以认为是对内存的优化,不像列表解析,一次构造出整个结果列表
如果生成器表达式是在独立的圆括号中,就不需要再用圆括号括住
生成器函数和生成器表达式比较
子主题
生成器是单迭代器,自身就是可迭代的
编写自己的map
子主题
编写自己的zip
子主题
自定义可迭代类
解析
语法源自于集合理论表示法中的一种结构
列表解析可以做到的事情,for循环都可以做,但是列表解析更简单,并且是转化为C语言执行,速度也更快
[ 关于x的表达式 for x in y if 关于x的boolean表达式]
for可以嵌套,也可以选择携带if
子主题
子主题
也支持集合和字典解析
map函数是将一个函数应用于一个可迭代对象中的元素,而解析是将表达式应用于可迭代对象的元素
矩阵
3*3 矩阵
M 的第二列
M 的对角线
M * N
集合解析和字典解析
最后的集合解析和字典解析是 python3.0 中新增的
集合和字典解析可以认为是生成器传递给 类型名的语法糖
比较不同迭代的性能
计时模块
调用内置函数,map最快,其次是列表解析
子主题
执行运算 列表解析最快
子主题
文档
文档资源
子主题
PyDoc
help
子主题
python -m pydoc -p port
https://pypi.org/search/
查询可用包
https://www.pythonchecker.com/
风格检查
https://blog.finxter.com/
快速学习
函数
相关的语句和表达式
子主题
子主题
def
可执行的语句
执行def时,创建函数对象,并将其赋值给函数名(变量名)
lambda
可以出现在任何表达式出现的地方
yeild
向调用者返回一个结果对象,但是记住它离开的地方
global
声明一个模块级的变量并被赋值
nonlocal
修改外部函数本地作用域中的变量值
多态
一个操作的意义取决于被操作对象的类型(对象类型是在运行时确定的)
不建议在函数中做类型检测,破坏了灵活性,将函数的使用限制到特定的类型上,这也正是面向接口编程而不是特定类型对象编程的思想
设计原则
对于输入使用参数,对于输出使用return
尽量避免使用全局变量
不要改变可变类型的参数,除非确实有必要
每个函数应该只有一个目标,用一句话可以表达函数要做什么事情,否则应该考虑拆解
避免直接修改另一个模块中的变量,否则会导致模块间耦合性
输入输出
递归
这种不确定的嵌套深度是循环遍历不了的
函数对象
函数就是对象,只不过多了可以调用的操作
内省
子主题
属性
可以给函数对象动态添加属性,这些属性类似于其他语言中的静态本地变量
注解
对参数和返回值可以添加注解
注解可以通过 __annotations__ 获取
注解可以通过 __annotations__ 获取
用途
参数类型或值的限定
注册函数接口信息
函数装饰器参数
注解只能用于 def 语句,不能用于lambda 表达式
lambda
子主题
lambda也可以给参数指定默认值
与def的区别
lambda 是一个表达式,def是语句
lambda主体是单个表达式,而不是语句
lambda 也可以嵌套,过于复杂,不建议使用
函数式编程
map
filter
reduce
...
陷阱
本地变量是静态检测的(编译时),但是运行时一行一行运行的
默认参数是作为对象保存到函数上面的,在执行def语句时创建的,而不是函数调用时创建
嵌套作用域中的变量是在嵌套函数被调用时查找,这时得到的值是一样的。类似于javaScript
作用域
作用域
变量在第一赋值时创建出来,并且绑定到特定的命名空间(与变量赋值的位置有关)
模块的全局变量在被导入以后,会作为模块的属性存在,这时模块就可以理解为包含了全局变量作为属性的对象
法则
每个模块对应一个全局作用域
每次对函数的调用都会创建一个本地作用域
作用域查找原则
子主题
1
内置作用域对应的就是 __builtins__ 内置模块全局作用域。有时如果本地作用域中的变量隐藏了内置作用域中的变量,可以直接调用 __builtins__.变量名
global
4 2 2
减少使用全局变量
这里的 X的值不能确定,它是根据这两个函数的调用顺序确定的,这给代码调试以及以后的代码调整带来了潜在的风险
限制了作用域查找只在模块全局变量中或内置模块中
nonlocal
10 10
类似于 global ,但是将本地变量作用域提升为 嵌套 def作用域变量,而不是全局变量
nonlocal 声明的变量必须在外层函数本地作用域中存在,否则会抛出异常,这一点和global不一样
修改外层函数的状态,并应用于下次调用
其他实现方式
类实现。__call__方法表示对象可以像函数一样调用
函数也是对象,可以携带状态信息
限制了作用域查找只在 外层函数中
最小化文件间的修改
子主题
这使得 X 与这两个模块有强相关,如果第三个模块需要使用X,它必须知道有这两个模块的存在
通过方法调用去设置,让使用者更清楚有可能有其他模块通过这个set方法,修改X的值
嵌套作用域
当调用 marker时,返回的是一个函数,这个函数中有一个变量引用自marker作用域,即便maker作用域已经销毁,这也就是所谓的闭包,常用于产生工厂方法
没有嵌套作用域概念之前,保存外层函数状态的方法可以通过参数默认值
lambda是嵌套作用域的常用者。lambda是表达式,def是语句。
循环中定义嵌套函数
嵌套作用域中的变量是在嵌套函数被调用时查找,这时得到的值是一样的。类似于javaScript
可以通过默认参数解决
保存函数状态信息的方法
nonlocal
global
单一共享
类属性
函数属性
参数
传递参数
参数传递是通过自动将对象赋值给本地变量名来实现
参数传递是引用传递
对于不可变对象参数可以理解为“值传递”
对于可变对象可以理解为 “引用传递”
参数名是函数的本地变量名
参数和共享引用
可以与赋值语句对比
多输出
返回元组
序列解析
参数匹配
默认是通过形参和实参位置从左到右匹配
关键字参数
默认参数
可变参数
15
可变参数解包
10
10
子主题
Keyworld-only 参数
keyword-only 参数 出现在 *args之后,**kargs 之前
匹配语法
子主题
def fun(**name) 匹配并收集(在字典中) 所有包含关键字的参数
匹配规则
keyword-only 必须用关键字参数传递
子主题
混合使用
定义函数
1 2 3 4 1
1 2 3 4 5
1 2 3 4 1
1 2 3 4 1
1 2 3 4 1
1 2 3 4 5
1 2 3 4 1
1 2 3 4 1
1 2 3 4 1
模块
import 如何工作
import b
找到外部文件b.py,执行并创建模块对象,并将其赋值给变量b。
如果模块已加载过,可以在 sys.modules中找到,直接将内存
中的模块对象赋给b
如果模块已加载过,可以在 sys.modules中找到,直接将内存
中的模块对象赋给b
搜索(sys.path 可以查看所有实时搜索的路径,从左至右搜索)
程序主目录
顶层(脚本)文件目录
PYTHONPATH目录
标准链接库目录
任何 .pth 文件的内容
.pth 文件应该放到哪儿?
编译(可选)
根据源码文件的时间戳判断字节码(.pyc) 文件是不是已过期,如果过期重新编译
如果只找到了字节码文件,直接加载字节码
如果是第一次导入,需要编译为字节码
执行
模块文件选择
从左至右搜索 sys.path
import hook
__import__ 函数
distutils
类
异常
装饰器
管理属性
元类
0 条评论
下一页