1. 闭包
Python函数是支持嵌套的。如果在一个内部函数中对外部函数作用域(非全局作用域)的变量进行引用,那么内部函数就会被称为闭包。闭包需要满足如下3个条件:
- 存在于两个嵌套关系的函数中,并且闭包是内部函数;
- 内部函数引用了外部函数的变量(自由变量);
- 外部函数会把内部函数的函数名称返回。(不带括号)
2. 装饰器
2.1 装饰器的概念
假设我们已经开发了一个本有的函数,后续可能会增加临时的需求,例如插入日志,我们可以增加一个包裹函数,由它来负责这些额外的需求,这个包裹函数就是装饰器 。
2.2 装饰器主要应用在如下场景
2.3 实例
装饰器是一个函数,它需要接收一个被修饰的函数作为参数。例如,有如下一个装饰器函数:
def w1(func):
print('正在装饰')
def inner():
print('正在验证权限')
func()
return inner
装饰器是个嵌套函数
内部函数是一个闭包
外部函数接收的是被修饰的函数(func)
通过在函数定义的前面添加@符号和装饰器名,实现装饰器对函数的包装。给f1函数加上装饰器,示例如下:
@w1
def f1():
print('f1')
调用f1时候,程序会自动编译生成调用装饰器函数的代码,等价于:
f1 = w1(f1)
2.4 多个装饰器
多个装饰器应用在一个函数上,是一个嵌套的关系,调用顺序是从下至上,再从上至下。
2.5 装饰有参数的函数
2.6 装饰带有返回值的函数
2.7 带有参数的装饰器
如果给装饰器添加参数,需要增加一层包装,先传递参数,然后再传递函数名。示例代码如下:
3.常见python内置函数
3.1 map函数
map函数会根据提供的函数对指定的序列做映射。
map函数的定义如下:
map(function, iterable,…)
第1个参数是函数的名称;第2个参数表示支持迭代的容器或者迭代器。
map函数的作用是以参数序列中的每个元素分别调用function函数,把每次调用后返回的结果保存为对象。
例:
func = lambda x:x+2
result = map(func, [1,2,3,4,5])
print(list(result))
3.2 filter函数
filter函数会对指定序列执行过滤操作。
filter函数的定义如下:
filter(function,iterable)
第1个参数可以是函数的名称;第2个参数表示的是序列、支持迭代的容器或迭代器。
例:
func = lambda x:x%2
result = filter(func, [1, 2, 3, 4, 5])
print(list(result))
3.3 reduce函数
reduce函数会对参数序列中的元素进行迭代运算。
reduce函数的定义如下:
reduce(function, iterable[, initializer])
- function是一个带有两个参数的函数;
- iterable是一个可迭代对象;
- initializer表示固定的初始值。
函数实现原理:
函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
例:
from functools import reduce
func = lambda x,y:x+y
result = reduce(func, [1, 2, 3, 4, 5])
print(result)