闭包和装饰器
函数名的作用
回顾
Python是一门以面向对象为编程思想的语言 一切皆对象
如果直接写函数名 = 对象
def get_sum():Q
a= 10
b = 20
return a + b
get_sum 对象
get_sum()函数调用
作用
1.函数名可以作为对象赋值给变量
my_sum = get_sum
2.函数名可以作为函数的实参进行传递
def mrthod(fn):
fn()
method(get_sum)
传入:函数对象
method(my_sum)
闭包
概述
函数嵌套的写法 内部函数可以直接使用外部函数的引用
作用
延长外部函数的局部变量的生命周期 即是外部函数执行完毕 内部函数依然可以使用其中的局部变量
前提条件
1.有嵌套
2.有引用
3.有返回
格式
def 外部函数名(形参列表):.....def 内部函数名(形参列表):.....使用外部函数的变量return 内部函数名nonlocal关键字可以实现让内部函数 修改外部函数的改变值
装饰器概述属于闭包的一种写法目的 作用在不改变原函数的基础上 对其功能做增强格式def 外部函数名(形参列表):
def 内部函数名(形参列表):使用外部函数的变量额外功能return 内部函数名前提条件1.有嵌套2.有引用3.有新功能4.有返回装饰的格式思路1: 传统写法变量名= 装饰器名(被装饰的函数名)变量名() #这里强调的是 装饰后的函数思路2:语法糖在原函数的声明上 加上@ 装饰器名即可之后就跟正常的调用函数一致记忆1.装饰器的内部函数的格式 必须要和被装饰的原函数格式 保持一致案例装饰器 装饰 无参无返回值的函数.装饰器 装饰 无参有返回值的函数.装饰器 装饰 有参无返回值的函数.装饰器 装饰 有参有返回值的函数.装饰器 装饰 不定长参数的函数.多个装饰器, 同时装饰某个函数带参数的装饰器, 装饰某个函数
(1)闭包的特点是什么?
“”"
函数嵌套的写法 内部函数可以直接使用外部函数的变量
延长外部函数的声明周期 外部函数执行完毕 内部函数依然可以使用外部函数的局部变量
前提条件 1. 有嵌套 2. 有引用 3. 有返回
若要修改外部函数的变量值 则需要用 nonlocal关键字修饰
“”"
import time
(2)什么是装饰器?装饰器有哪些特点?
“”"
装饰器是闭包的一种写法 目的是在不改变原函数的基础上 对其功能做增强
比闭包的前提条件多了一个 新增额外功能
特点: 1.装饰器的内部函数的格式必须要和表内装饰的原函数保持一致
2. 有语法糖写法 在被装饰的函数家上 @装饰器名
“”"
实操题
# (1)定义一个闭包,用于求解方程的y与x值的变化,例如 y = ax + b# 创建外部函数 接收ab系数
def line_y(a, b):# 创建内部函数接收xdef lin_x(x):return a*x + b#返回内部函数对象return lin_x# 调用外部函数 得到内部函数对象
line_xy = line_y(1,4)
# 调用内部函数
line_xy(2)#
(2)创建一个闭包,实现统计函数执行的次数功能。有如下调用闭包函数的代码:
# f = func_count()
# f()
# f()
# f()
#
# 执行结果如下:
#
# > hello world
# > 执行了1次
# > hello world
# > 执行了2次
# > hello world
# > 执行了3次
#
# 请完善 func_count 函数的实现。def func_count():count = 0def pr_inner():print('hello world')nonlocal countcount += 1print(f'执行了{count} 次')return pr_innerf = func_count()
f()
f()
f()
# (3)请使用装饰器方式来统计输出100000句"程序员YYDS"的执行时间。def time_fn(func):def time_inner():t1 = time.time()print(t1)func(100000)t2 = time.time()print(t2)print(f'执行所用时间为{t2 - t1}')return time_inner@time_fn
def print_fn(count):for i in range(0, count):print('程序员YYDS')print_fn()
(4)定义一个函数, 返回字符串, 使用装饰器实现对这个字符串添加后缀.txt。
def print_in(fnc):def inner_fn():return_f = fnc()return1 = return_f + '.txt'return return1return inner_fn@print_in
def print_str():return '凡人修仙传'print(print_str())
坚持分享 共同进步 如有错误 欢迎指出