6.1函数
python简化函数定义过程
作用域规则,闭包,装饰器,生成器,协程:函数式编程特性
列表推导,生成器表达式:声明式编程与数据处理的工具
def定义函数
调用时参数的顺序与数量匹配:位置参数
定义时指定默认值,则参数可选
默认参数值:定义时作为值传入的对象,定义时复制一次
不可变对象:默认参数调用间保持一致
可变对象:调用间保留之前的修改。声明为None
只完成一次赋值?赋值发生在定义处?调用处?
函数参数是局部变量,静态分配默认值:用于初始化赋值
可变数目参数*args
关键字参数:调用时指定参数名
位置参数,关键字参数,可变长位置参数,关键字字典
**kargs传递关键字参数字典
可变长参数通常用于编写其他函数的包装器与代理
6.2参数传递与返回值
函数参数按复制传递?
不同于按值传入或按引用传入
传
不可变对象:按值
可变对象:按引用
修改了输入值:副作用
return 缺省,返回None
6.3作用域规则
执行函数时,创建新的局部命名空间
当变量被赋值时,变量始终被绑定在该函数的局部命名空间
global:声明变量属于全局空间(导入)
#####同条语句出现的相同名字只能是同一变量:不能突然改变作用域
嵌套函数中的变量:静态作用域限定
python3 nonlocal,把变量绑定到外层嵌套的局部变量,依然是静态作用域
局部变量没赋值:unbondingLocalError
6.4 作为对象与闭包的函数
作为数据处理时,隐式携带定义函数时的环境信息(深约束?)
x
def fun
函数中出现变量:向外层搜索局部——全局——内置
fun,可使用x,且优先级高,类似于静态变量(可访问性不一样)
定义时环境,调用时环境,优先级
闭包:代码地址与其执行环境(定义处环境)打包
.__globals__
.__closure__
执行环境是定义处作用域,访问至全局空间
使用嵌套函数时,闭包捕捉内部函数执行所需的整个环境
用于惰性求值,延迟求值
嵌套函数:定义时参数缺省
调用时绑定参数,返回可调用对象(参数作为环境的一部分:缺省——得到)
闭包:传递不同的调用对象
传参——执行环境完整——可调用
不同环境不同闭包不同对象
一系列函数调用中保持某个值:静态变量
对嵌套函数传参,定制不同的可调用对象
闭包作为函数的定制化(缺省一部分引用环境:参数提供)
闭包作为静态变量的实现(函数内部保持环境,keep)
闭包捕捉内部函数的环境,可用于包装现有函数,添加额外功能
6.5装饰器
一个函数,用于包装另一个函数(方法)或类
修改或增强对象的行为
@
定义为闭包,嵌套在要修饰函数的外层
def 装饰器(real)
def fun
强化函数real
return real处理后
return fun
类装饰器返回类
6.6生成器与yield
生成器函数对象,yield
yield关键字定义生成器函数
生成值的序列,以便在迭代时使用
调用函数,返回生成器函数对象
__next__(调用)执行函数,直到yield
用于消耗序列的操作,要求迭代器对象的操作?
StopIteration异常标志迭代结束
部分消耗:close()方法
6.7协程与yield表达式
协程:函数,使用yield表达式,出现在运算符右边
向函数发送值时执行
生成器对象.send(数据)
r=receiver()
r.send("")
r.close()
close在生成器/协程内部生成GeneratorExit异常
如果yield表达式中提供了值,协程可使用yield语句同时接收/发送值
6.8使用生成器与协程
生成器模拟管道,内存占用小
协程反向管道,编写数据流处理程序,嵌套连接协程,进而实现并发
6.9列表推导
列表——操作——新列表
[expression for item in iterable if condition
item in iterable if condition]
表达式构造出的元组必须加()去歧义
在当前作用域求值,保留修改
py3迭代变量为私有变量
6.10生成器表达式()
创建生成器对象,用于迭代操作
提高性能,减少内存使用
list(可迭代对象)——列表
元组
字典
集合
6.11声明式编程
源自数学集合论
声明式特性:程序组织为 一系列(可同时操作的)数据计算
不关心循环的具体实现
可用于模拟数据库操作
6.12lambda运算符
lambda语句:创建表达式形式的匿名函数
lambda args : expression
不能出现 多个语句或其他表达式语句
用于指定短小的回调函数
6.13递归
不做尾递归优化
不能用于生成器与协程?
递归调用只会创建一个新的?生成器对象,不会实际迭代它
对递归程序使用装饰器:所有内部递归调用也装饰后进行
装饰器用于系统管理时,少用递归
6.14文档字符串
装饰器包装函数破坏文档字符串
@wraps
6.15函数属性
任意添加,在__dict__中
@wraps
6.16
eval
exec
complie
执行表达式字符串,返回结果
在调用者命名空间执行
接手可选的映射对象,分别作为:全局,局部命名空间
缺省:当前值