def outter(): x = 1 def inner() print(x) # 这一步引用 x = 1 return innerres = outter()res() # 1 def func() x = 2 res() # 这里相当于 res(outter()),而res()的调用结果为1func() # 1,这里调用func函数,执行内部函数代码,虽然x = 2存在,但是执行res()后,又执行了一次x = 1赋值,所以结果返回1给函数体传值的第一种方式:传参
def index(username): print(username)给函数体传值的第二种方式:闭包
def outter() x = 1 y = 2 def my_max(): if x > y: return x return y return my_maxres = outter() # res 就是my_max函数的内存地址res() # my_max函数的内存地址print(res()) #结果为x,y中的最大值闭包方式1
或者
def outter(x,y) def my_max(): if x > y: return x return y return my_maxres = outter(1,2) # res 就是my_max函数的内存地址res() # my_max函数的内存地址print(res()) # x,y中的最大值闭包方式2
Pycharm解释器知识点: pip3 install requests装requests模块
函数传参的第一种方式:直接给函数传参import requests # 导入requests模块def my_get(url): response = requests.get(url) if response.status_code == 200: print(len(response.text))my_get(‘此处输入网址‘)直接给函数传参 函数传参的第二种方式:*闭包*
import requestsdef outer() url = ‘网址‘ def my_get(): response = requests.get(url) if response.status_code == 200: print(len(response.text)) return my_get()my_jd = outter(‘此处输入网址‘)my_jd() # 相当于my_jd(outter())my_baIDu = outter(‘此处输入网址‘)my_baIDu() # 相当于my_baIDu(outter())装饰器:
装饰器:用工具给被装饰对象添加新的功能
开放封闭原则:
开放:对扩张开放 (你扩展没事,别减少代码) 封闭:对修改封闭 (不被允许修改原代码\被修饰函数代码)@H_688_403@装饰器必须遵循的两个原则:
1.不改变被装饰对象源代码 2.不改变被装饰对象(可调用对象)的调用方式def index(): passindex() # 上面定义的index函数,你就老老实实的用常规方式调用index()函数
关于如何使用?
1.统计index函数执行时间import timeprint(time.time(3)) # 1562812014.731474 时间戳,当前时间距离1970-1-1 00:00:00相差的秒数def index(): print(‘XXXXXX‘)time.sleep(3) # 此处是让cpu睡3秒print(‘XXXXX‘) # 这是返回输出XXXXX所执行的时间2.下面是常规的用start和end来记录当前时间:
import timedef index(): time.sleep(3) print(‘XXXXXX‘)strat = time.time()index()end = time.time()print(‘index run time:%s‘%(end-start)) # 返回的是index函数从开始到结束的运行时间差3.下面是初步装饰函数:
import timedef index(): time.sleep(3) print(‘XXXXXX‘)def get_time(func) # func=index函数 strat = time.time() func() # func=index函数内存地址() end = time.time() print(‘index run time:%s‘%(end-start))get_time(index)装饰器简单版本:
import timedef index(): time.sleep(3) print(‘XXXXXX‘)def outter(func): def get_time(): start = time.time() func() end = time.time() print(‘index run time:%s‘ % (end - start)) return get_timeres = outter(index)res()简单版本 装饰器进化版本:
如果我们要统计login执行时间:
import timedef index(): time.sleep(3) print(‘XXXXXX‘)def login(name): time.sleep(1) print(‘%s is sb‘%name)def outter(func): # func = 最开始的login函数的内存地址 def get_time(*args,**kwargs): # args = (‘egon‘,) kwargs = {} strat = time.time() func(*args,**kwargs) # func=最开始的login函数内存地址() 直接调用 end = time.time() print(‘index run time:%s‘%(end-start)) return get_timelogin = outter(login) # outer(最开始的login函数内存地址) login(‘egon‘)VIEw Code
import timedef index(): time.sleep(3) print(‘XXXXXX‘)def login(name): time.sleep(1) print(‘%s is sb‘%name)def outter(func): # func = 最开始的login函数的内存地址 def get_time(*args,) kwargs = {} strat = time.time() res = func(*args,**kwargs) # func=最开始的login函数内存地址() 直接调用 return res end = time.time() print(‘index run time:%s‘%(end-start)) return get_timelogin = outter(login) # outer(最开始的login函数内存地址)res = login(‘egon‘)login(‘egon‘)VIEw Code2
‘‘‘‘‘‘
函数参数的问题:无参函数和有参函数是否都可以直接调用
函数可以接收任意数量的参数
语法糖在书写时应该与被装饰对象紧挨着,两者之间不要有空格
‘‘‘‘‘‘
def outter(func): def get_time(*args,**kwargs): strat = time.time() func(*args,**kwargs) return res end = time.time() print(‘index run time:%s‘%(end-start)) return get_time @outter # login = outer(index)def index(): time.sleep(3) print(‘XXXXXX‘) @outter # login = outer(login)def login(name): time.sleep(1) print(‘%s is sb‘%name)语法糖的应用 @H_688_403@装饰器模板:
def outter(func): def inner(*args,**kwargs): print(‘执行被装饰函数之前,你可以做的 *** 作‘) res = func(*args,**kwargs) print(‘执行被装饰函数之后,你可以做的 *** 作‘) return res return inner
认证装饰器:
执行函数index之前必须先输入用户名和密码,正确之后才能执行index;否则提示用户输入错误,结束程序
import time user_dic = {‘is_login‘:None} def login_auth(func): # 其实就是func = index def inner(*args,**kwargs): if user_dic[‘is_login‘]: res = func(*args,**kwargs) return res else: username = input(‘请输入用户名:‘).strip() password = input(‘请输入密码:‘).strip() if username == ‘jason‘ and password == ‘123‘: user_dic[‘is_login‘] = True res = func(*args,**kwargs) return res else: print(‘用户名或者密码错误‘) return inner @login_authdef index(name): time.sleep(1) print(‘%s is dsb‘%name)认证装饰器
多层装饰器:(重要)
装饰器在装饰的时候,顺序是从下往上
装饰器在执行的时候,顺序是从上往下
import timedef outter(func): def get_time(*args,**kwargs): strat = time.time() res = func(*args,**kwargs) return res end = time.time() print(‘index run time:%s‘%(end-start)) return get_timedef login_auth(func): # 其实就是func = index def inner(*args,**kwargs): # 这里的参数是跟被装饰函数的参数一一对应的 if user_dic[‘is_login‘]: res = func(*args,**kwargs) return res else: username = input(‘请输入用户名:‘).strip() password = input(‘请输入密码:‘).strip() if username == ‘jason‘ and password == ‘123‘: user_dic[‘is_login‘] = True res = func(*args,**kwargs) return res else: print(‘用户名或者密码错误‘) return inner @login_auth # index = login_auth(get_time) index = inner函数的内存地址@outter # get_time = outter(index) index是最开始的indexdef index(name): time.sleep(1) print(‘%s is dsb‘%name)多层装饰器 三层装饰器:(重要)
def login_auth2(data_source) def login_auth(func): # 其实就是func = index def inner(*args,**kwargs): # 这里的参数是跟被装饰函数的参数一一对应的 if user_dic[‘is_login‘]: res = func(*args,**kwargs) return res else: if data_source == ‘file‘: username = input(‘请输入用户名:‘).strip() password = input(‘请输入密码:‘).strip() if username == ‘jason‘ and password == ‘123‘: user_dic[‘is_login‘] = True res = func(*args,**kwargs) return res else: print(‘用户名或者密码错误‘) elif data_source == ‘MysqL‘: print(‘form MysqL‘) elif data_source == ‘ldsp‘: print(‘from ldsp‘) else: print(‘暂时无数据来源‘) return inner @login_auth2(data_source,x,t) # login_auth2(data_source,t)等价于login_auth,data_source = ‘file‘ @outter # get_time = outter(index) index是最开始的indexdef index(name): time.sleep(1) print(‘%s is dsb‘%name)三层装饰器 装饰器补充:
我们用装饰器的最终目标就是:
用户查看被装饰函数的函数名的时候,查看到的就是被装饰函数本身 用户查看被装饰函数的注释的时候,查看到的就是被装饰函数的注释方法就是下面这两句代码:
form functools import wraps
@wraps(func) ‘‘‘装饰器修复技术‘‘‘
form functools import wrapsdef outter(func): @wraps(func) # 装饰器修复技术 def inner(*args,**kwargs): print(‘执行被装饰函数之前,你可以做的 *** 作‘) res = func(*args,**kwargs) print(‘执行被装饰函数之后,你可以做的 *** 作‘) return res return inner @outter # outter(最原始的index内存地址)def index():‘‘‘这是index函数:return‘‘‘print(index)print(help(index)) # 查看函数的注释print(index.name) # 查看函数名字字符串形式装饰器补充 总结
以上是内存溢出为你收集整理的python day11全部内容,希望文章能够帮你解决python day11所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)