目录
一:首先来了解什么是闭包,闭包的使用
1.闭包:
1.1什么是闭包:
定义双层嵌套函数,内层函数可以访问外层函数的变量
将内层函数作为外层函数的返回,此内层函数就是闭包函数;
简单闭包的使用:
def out(log):
#外部函数
'''
闭包:函数的嵌套,有点类似于匿名函数的写法
:param log:
:return:
'''
def inner(mag):
'''
嵌套、定义一个内部函数
:param mag:
:return:
'''
# (f '{}') 字符串格式化
print(f'<{log}>{mag}<{log}>')
pass
#外部函数返回内部函数
return inner
#获取一个闭包函数对象
fn1=out('黄永利') #fn1相当于一个函数
fn1('牛皮')
fn2=out('字节跳动')
fn2('太酷辣')
fn3=out('重庆xxx学院')
fn3(666)
运行结果:
简单闭包实现银行存取款atm小案例:
def account_create(initial_anount=0):
'''
闭包实现银行账户的存取款操作
:param initial_anount:
:return:
'''
def atm(num,deposit=True):
nonlocal initial_anount
print(f'账户剩余存款:{initial_anount}')
if deposit:
initial_anount+=num
print(f'存款:+{num},账户余额:{initial_anount}')
pass
else:
initial_anount-=num
print(f'存款:-{num},账户余额:{initial_anount}')
pass
pass
return atm
fn=account_create(1000)
fn(1000,deposit=True)
fn(100,deposit=False)
运行结果:
1.2闭包的好处和缺点:
优点: 不用定义全局变量,也可以让函数持续访问和修改一个外部变量;
闭包函数引用的外部变量,是外层函数的内部变量。
作用域封闭不容易被误操作修改。
缺点: 额外的内存占用。(无法正常释放内存空间)
1.3nonlocal关键字的作用
在闭包函数(内部函数中)可以修改外部函数的变量值
方法:用nonlocla声明这个外部变量。
二:了解什么是装饰器,怎么使用装饰器
2.装饰器
2.1什么是装饰器:
装饰器就是使用创建的闭包函数,在闭包函数内调用目标函数。
简单装饰器的使用:
# def outer(func):
# '''
# 简单装饰器的定义应用 (一般写法)
# :param func:
# :return:
# '''
# def inner():
# print('我睡觉了')
# func() #添加函数功能做装饰
# print('我睡醒了')
# pass
# return inner
#
# def sleep():
# import random
# import time
# print('睡眠中...')
# time.sleep(random.randint(1,5))
# pass
# fn=outer(sleep)
# fn()
##注释快捷:选中要注释的代码+ctrl+c
##取消注释:选中注释了的代码+ctrl+c
def outer(func):
'''
简单装饰器的定义应用 (快捷写法也称语法糖)
:param func:
:return:
'''
def inner():
print('我睡觉了')
func() #添加函数功能做装饰
print('我睡醒了')
pass
return inner
@outer #快捷调用方法
def sleep():
import random
import time
print('睡眠中...')
time.sleep(random.randint(1,5))
pass
# fn=outer(sleep)
# fn()
sleep()
代码调试运行结果:
2.2装饰器作用:
可以达到不改动目标函数的同时,添加额外的功能。
*注意*与包的区别:
装饰器实质上是一个闭包函数,只是装饰器这个闭包函数的参数有且只有一个并且是函数类型的话,他才是装饰器,否则也只是一个闭包函数!
以上就是个人对python中的闭包函数和装饰器函数的简单理解,有更好见解的小伙伴,欢迎评论区留言一起讨论。