目录
一.闭包函数
闭包函数:外函数中声明了一个内函数,在内函数中引用了外函数的变量,外函数返回内函数的引用
import requests
#普通函数实现
def get_page(url):
r= requests.get(url)
print(r.encoding) #获取响应页面采用的编码方式
get_page("http://baidu.com") #结果返回utf8
#闭包函数实现
def outter(url): #外函数
def inner(): #内函数
r= request.get(url)
print(r.encoding)
return inner #外函数返回内函数的引用
f = outter("http://baidu.com")
f() #结果返回utf8
如果外函数的变量是不可变数据类型,并且要在内函数中对外函数的变量进行处理,需要在变量前加nonlocal进行声明;
如果外函数的变量是可变数据类型,并在内函数中对外函数的变量进行处理时,不需要在变量前加nonlocal进行声明。
def outter(): #外函数
age = 20
li = [1,2,3]
def inner(): #内函数
nonlocal age #age是不可变数据类型
age += 1
li.append(4) #li是可变数据类型
print(age)
print(li)
return inner #外函数返回内函数的引用
f = outter()
f() #结果返回21 [1,2,3,4]
二.装饰器
装饰器:在不改变函数的源码、调用方式的前提下,为函数添加新的功能
通用装饰器模板:
def outter(func): #func,被装饰的函数名称
def wrapper(*args,**kwargs):
res = func(*args,**kwargs):
return res #返回被装饰的函数的运行结果
return wrapper
例一:统计函数运行时间
import time
def get_run_time(func): #func,被装饰的函数名称
def wrapper(*args,**kwargs):
start = time.time()
res = func(*args,**kwargs) #调用被装饰的函数
print(time.time()-start) #输出被装饰函数的运行时间
return res #返回被装饰函数运行结果
return wrapper
@get_run_time
def f(): #无参数
for i in range(10):
print('.',end='')
time.sleep(0.2)
f()
@get_run_time
def f(n): #有参数
for i in range(n):
print('.',end='')
time.sleep(0.2)
f(20)
例二:装饰器传参要用三层函数
def login(user,passwd):
def outter(func):
def wrapper(*args,**kwargs) #调用被装饰函数的运行结果
if user == "admin" and passed == "123456":
res = func(*args,**kwargs)
return res
else:
print("用户名或者密码错误“)
return wrapper
return outter
@login("admin","1234561")
def add_customer(name):
print(f'新增会员{name}成功')
add_customer('list')