第六章:函数与函数式编程——参考手册笔记

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

原文地址:https://www.cnblogs.com/qmcj/p/9108199.html