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