Python—高级函数
一、闭包
Python函数是支持嵌套的。如果在一个内部函数中对外部函数作用域(非全局作用域)的变量进行引用,那么内部函数就会被称为闭包。闭包需要满足如下3个条件: 存在于两个嵌套关系的函数中,并且闭包是内部函数; 内部函数引用了外部函数的变量; 外部函数会返回内部函数的函数名。 举例: #演示内置函数 def a():#1定义外部函数 b=1#3 外部函数代码 def c():#4定义内部函数 print(b)#6 执行内部函数代码 c()#5调用内部函数 a() #2调用外部函数 #演示把内部函数返回(闭包的必要条件),外部可以用接收返回值的方式来访问内部函数 def a(): def b(): return 1 #定义了内部函数的返回值为1 return b #定义了外部函数的返回值为内部函数 rst=a() #接收了外部函数的返回值,也就是内部函数 print(rst)#rst就是内部函数 print(a()())#a()()=rst() print(rst())#rst()是调用内部函数 #使用一个函数作为另一个函数的参数 def a(func_a):#可以传任意函数 print("你好,我是小a!") func_a() #可以对已定义的函数做额外的操作,不需要修改原来的函数 print("gudeibai") def b(): print("你好,我是小b!") a(b) def outer(start=0): count=[start] def inner(): count[0]+=1 return count[0] return inner out=outer(5) print(out()) #使用闭包实现案例 #有银行卡才能执行汇款的操作 #外部函数为创建银行卡 #内部函数为汇款的操作 def bank(isVIP,action): if isVIP: print("客户你好,欢迎光临") else: print("您好,给你办一张新卡") if action=="huikuan": def remit(): print("进行汇款操作") return remit if action=="cun": def cunkuan(): print("进行存款") return cunkuan card=bank(False,"cun") card()二、什么是装饰器
假设我们已经定义了一个函数,后续可能会增加临时的需求,例如插入日志,我们可以增加一个包裹函数,由它来负责这些额外的需求,这个包裹函数就是装饰器 。 装饰器主要用于下列场景: 引入日志; 函数执行时间统计; 执行函数前预备处理; 执行函数后清理功能; 权限校验; 缓存。 装饰器是一个函数,它需要接收一个参数,该参数表示被修饰的函数。例如,有如下一个装饰器函数: def wrap(func): print(‘正在装饰’) def inner(): print(‘正在验证权限’) func() return inner() 装饰器是个嵌套函数 内部函数是一个闭包。 外部函数接收的是被修饰的函数(func) 通过在函数定义的前面添加@符号和装饰器名,实现装饰器对函数的包装。给test函数加上装饰器,示例如下: @wrap def test(): print(’test') 此时,程序会自动编译生成调用装饰器函数的代码,等价于: test = wrap(test) 举例: 1.#演示装饰器 from functools import wraps, reduce def a(func_a): print("装饰器开始工作") @wraps(func_a) def b(): print("闭包开始工作") func_a() print("装饰器工作结束") return b def decorator_c(): print("感觉很虚空,需要被装饰") rst=a(decorator_c()) #b rst() @a def abc(): print("想要被装饰") abc() print(abc.__name__) 2. def func(function_name): print("这是一个有返回值的闭包") def func_in(): return function_name() return func_in @func #装饰器的名称 def test(): return 'hello world' a=test() print(a) 3. def out(args): def fun(function_name): print('闭包') def fun_in(): print(args) return function_name() return fun_in return fun fun=out('hello') @fun def test(): return 'hello world' a=test() print(a)三、常见Python内置函数
- map函数
- filter函数
- reduce函数