目录
一.闭包函数
二.装饰器
一.闭包函数
闭包函数:外函数中声明了一个内函数,在内函数中引用了外函数的变量,外函数返回内函数的引用
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')
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)