一、普通函数:
一、闭包函数:
定义:外函数中声明了一个内函数,在内函数中引用了外函数的变量,外函数返回内函数的引用。
实例1:
def outter(): #外函数
age = 20 #外函数变量
def inner(): #内函数
print(age) #内函数中引用外函数变量
return inner #外函数返回内函数的引用
f = outter()
f()
实力2:
def outter(): #外函数
age = 20 #外函数变量
def inner(): #内函数
nonlocal age #此句声明age不是局部变量,可以修改外函数的变量
age += 1
print(age) #内函数中引用外函数变量
return inner #外函数返回内函数的引用
f = outter()
f()
二、装饰器
1. 在不改变函数源码、调用方式的前提下,为函数添加新的功能
2. 通用装饰器模板:
def outter(func):
def wrapper(*args,**kwargs):
res = func(*args,**kwargs)
return res
return wrapper
实例1:统计函数的运行时间
def get_run_time(func):
print("执行顺序:1")
def wrapper(*args, **kwargs):
print("执行顺序:2")
start = time.time()
res = func(*args, **kwargs)
print(time.time()-start)
print("执行顺序:4")
return res
return wrapper
@get_run_time
def f():
print("执行顺序:3")
for i in range(10):
print('.', end='')
time.sleep(0.2)
@get_run_time
def f_param(n):
print("执行顺序:3")
for i in range(n):
print('.', end='')
time.sleep(0.2)
f()
f_param(20)
实例2:为装饰器传参
def login(name, password):
def outter(func):
def wrapper(*args, **kwargs):
if name == 'admin' and password == '123456':
res = func(*args, **kwargs)
return res
else:
print("账户名或者密码错误")
return wrapper
return outter
@login('admin','1234567')
def customer(name):
print(f"欢迎{name}登陆")
customer('lisi')