函数与函数式编程

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
执行表达式字符串,返回结果
在调用者命名空间执行
接手可选的映射对象,分别作为:全局,局部命名空间
缺省:当前值

猜你喜欢

转载自www.cnblogs.com/qmcj/p/9108199.html