【7】python核心编程 第十一章-函数和函数式编程

1、*函数(与方法)装饰器

装饰器背后的主要动机源自python 面向对象编程。装饰器是在函数调用之上的修饰。这些修饰
仅是当声明一个函数或者方法的时候,才会应用的额外调用。
装饰器的语法以@开头,接着是装饰器函数的名字和可选的参数。紧跟着装饰器声明的是被修饰
的函数,和装饰函数的可选参数。装饰器看起来会是这样:
@decorator(dec_opt_args)
def func2Bdecorated(func_opt_args):
:
那么什么是装饰器?
现在我们知道装饰器实际就是函数。我们也知道他们接受函数对象。但它们是怎样处理那些函
数的呢?一般说来,当你包装一个函数的时候,你最终会调用它。最棒的是我们能在包装的环境下
在合适的时机调用它。我们在执行函数之前,可以运行些预备代码,如post-morrem 分析,也可以在
执行代码之后做些清理工作。所以当你看见一个装饰器函数的时候,很可能在里面找到这样一些代
码,它定义了某个函数并在定义内的某处嵌入了对目标函数的调用或者至少一些引用。从本质上看,
这些特征引入了java 开发者称呼之为AOP(Aspect Oriented Programming,面向方面编程)的概念。
你可以考虑在装饰器中置入通用功能的代码来降低程序复杂度。例如,可以用装饰器来:
???? 引入日志
???? 增加计时逻辑来检测性能
???? 给函数加入事务的能力

2、内建函数apply()、filter()、map()、reduce()

内建函数 描述
apply(func[, nkw][, kw])  用可选的参数来调用func,nkw 为非关键字参数,kw 关
键字参数;返回值是函数调用的返回值。
filter(func, seq)b 调用一个布尔函数func 来迭代遍历每个seq 中的元素; 返回一个
使func 返回值为ture 的元素的序列。
map(func, seq1[,seq2...]) 将函数func 作用于给定序列(s)的每个元素,并用一个列表来提
供返回值;如果func 为None, func 表现为一个身份函数,返回
一个含有每个序列中元素集合的n 个元组的列表。
reduce(func, seq[, init]) 将二元函数作用于seq 序列的元素,每次携带一对(先前的结果
以及下一个序列元素),连续的将现有的结果和下雨给值作用在获
得的随后的结果上,最后减少我们的序列为一个单一的返回值;如
果初始值init 给定,第一个比较会是init 和第一个序列元素而不
是序列的头两个元素。