函数对象
【1】定义
函数对象指的是函数可以被当做数据来处理
【2】可以直接被引用
定义一个函数用一个新的变量名来存,用新的变量名来调用
# 定义一个函数
def add(x, y):
return x + y
# 将函数地址绑定给一个变量
func = add
# 通过这个变量找到对应的地址,从而调用函数
res = func(1, 2)
print(res) # 3
【3】函数可以作为参数传递给另一个函数
def add(x, y):
return x + y
def foo(x, y, func):
return func(x, y)
res = foo(1, 2, add)
print(res) # 3
【4】函数的返回值可以是函数
我们直接将函数的内存地址返回
def add(x, y):
return x + y
def bar():
return add
func = bar()
print(func) # <function add at 0x000001F57A053E20>
res = func(1, 2)
print(res) # 3
闭包函数
【1】概念
闭包函数就是对外部作用域有引用的函数
内部函数对外部函数作用域有引用,这个内部函数就叫做闭包函数
x_global = 1
def outer():
# 定义局部变量,覆盖全局变量
x_global = 2
def inner():
# 打印外部函数的局部变量
print(x_global) # 2 inner()就是闭包函数
return inner
func = outer()
func()
【2】闭包函数的应用
- 装饰器
- 函数工厂模式
- 封装
【3】装饰器
闭包函数就是内嵌函数对外部函数作用域有引用的函数
def outer():
def inner():
print("hello world")
return inner
res = outer()
print(res) # <function outer.<locals>.inner at 0x000001A2012637F0>
print(res())
(1)时间模块
可以用来获取时间
import time
def add():
...
start_time = time.time()
time.sleep(4)
end_time = time.time()
print(f'{end_time - start_time}s') # 4.0009307861328125s
import time
def add():
time.sleep(3)
start_time = time.time()
add() # 调用不同函数
end_time = time.time()
print(f"{end_time - start_time} s") # 3.0077402591705322 s
# 两个都可以调用
import time
def add():
time.sleep(3)
def delete():
time.sleep(4)
def check_time(func):
start_time = time.time()
func()
end_time = time.time()
print(f"{end_time - start_time} s")
check_time(add) # 3.006422996520996 s
check_time(delete) # 4.012505769729614 s
# 装饰器就是在不改变原来函数调用方式的基础上增加额外的新功能
import time
def add():
time.sleep(3)
def delete():
time.sleep(4)
def outer(func):
func = func
def inner():
start_time = time.time()
func()
end_time = time.time()
print(f"{end_time - start_time} s")
return inner
add = outer(add)
add()
# 3.0092411041259766 s
(2)装饰器的语法糖
- 用timer来装饰带参数或不带参数的函数
- 为了简洁而优雅地使用装饰器,Python提供了专门的装饰器语法来取代index=timer(index)的形式
- 需要在被装饰对象的正上方单独一行添加 @timer, 时就会调用timer函数
import time
def outer(func):
func = func
def inner():
start_time = time.time()
func()
end_time = time.time()
print(f"{end_time - start_time} s")
return inner
@outer # add = outer(add)
def add():
time.sleep(3)
@outer # delete = outer(delete)
def delete():
time.sleep(4)
add() # 3.004960298538208 s
delete() #4.009537220001221 s
标签:闭包,函数,add,func,time,print,装饰,def
From: https://www.cnblogs.com/zyb123/p/18136163