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