高阶函数:函数可以作为参数传入;函数可以作为返回值。(满足其一即为高阶函数)
闭包
闭包:读取其它函数内部变量的函数
闭包 = 内部函数+定义函数时的环境
闭包的作用:保存外部函数的变量,不会随着外部函数调用完而销毁。
闭包的形成条件:
- 函数嵌套。
- 内部函数必须使用了外部函数的变量或者参数。
- 外部函数返回内部函数 这个使用了外部函数变量的内部函数就称为闭包。
# 闭包函数
def f():
x = 1
def g():
print(x)
return g
h = f()
h() # 即f()() f()相当于g f()()相当于g()
# 结果:1
# 不是闭包函数
def f():
x = 10
def g():
y = 5
print(y) # y属于g(),没有对外部函数进行引用
return g
f()()
# 闭包函数
def f(x):
def g():
print(x)
return g
h = f(1) # x的值在g()外
h()
装饰器
装饰器的作用:在不改变原函数的情况下,对已有的函数进行额外的功能扩展。
装饰器的形成条件:
- 不修改已有函数的源代码。
- 不修改已有函数的调用方式。
- 给已有函数增加额外的功能。
闭包与装饰器的区别:
- 装饰器实质上是一个闭包函数。
- 装饰器的参数仅有一个,且为函数类型时,它才是装饰器,否则就是闭包函数。
无参
时间模块:time
导包:import time
导包的作用:在不修改源代码的基础上给函数增加新的功能。
import time
start = time.time()
print(start) # 输出1970年01月01日00:00:00秒起至今的总秒数
# 结果:1664953651.1475735
time.sleep(1) # 休眠程序1秒
import time
def fn():
start = time.time()
print("fn..")
time.sleep(1)
end = time.time()
print(f"运行了{end-start}秒")
fn()
# 结果:fn..
# 运行了1.0006623268127441秒
import time
def fn():
print("fn..")
time.sleep(1)
def show_time(func): # 该函数的功能为展示时间
def inner():
start = time.time()
func()
end = time.time()
print(f"运行了{end - start}秒")
return inner
f = show_time(fn)
f() # 相当于inner()
# 结果:fn..
# 运行了1.0004348754882812秒
@ 语法糖
import time
def show_time(func):
def inner():
start = time.time()
func()
end = time.time()
print(f"运行了{end - start}秒")
return inner
@ show_time # fn = show_time(fn)
def fn():
print("fn..")
time.sleep(1)
fn()
# 结果:fn..
# 运行了1.0008530616760254秒
原函数参数
import time
def show_time(func):
def inner(a,b):
start = time.time()
func(a,b)
end = time.time()
print(f"运行了{end - start}秒")
return inner
@ show_time
def add(a,b):
print(a+b)
time.sleep(1)
add(1,2)
# 结果:3
# 运行了1.000861406326294秒
*args
**kwargs
import time
def show_time(func):
def inner(*args,**kwargs):
start = time.time()
func(*args,**kwargs)
end = time.time()
print(f"运行了{end - start}秒")
return inner
@ show_time
def add(*args,**kwargs):
sum1 = 0
for i in args:
sum1+=i
print(sum1)
time.sleep(1)
add(1,2,3,4,5)
# 结果:15
# 运行了1.0001788139343262秒