闭包函数:
闭:定义在函数内部的函数
包:内部的函数引用了外部函数作用域的名(变量名)
闭包也是一种传参方式
def outter(x,y): # x = 1 # y = 2 def my_max(): if x > y: return x return y return my_max res = outter(1,2) # outter加()本身会得到一个返回值my_max,实参1和2相当于变量值传给了x和y两个变量名 print(res())
import requests # 爬虫模块 #方式一 直接给函数传参 info1 = ‘https://www.baidu.com‘ info2 = ‘......‘ def my_get(rul): resuit = requests.get(rul) if resuit.status_code == 200: print(len(resuit.text)) my_get(info1) my_get(info2) ‘.....‘ #方式二 用闭包的方式给函数传参 def outter(func): # func = ‘https://www.jd.com‘ def my_get(func): resuit = requests.get(func) if resuit.status_code == 200: print(len(resuit.text)) return my_get res_jd = outter( ‘https://www.jd.com‘) # res = my_get res_jd() # my_get()
装饰器
器:就是一个工具
装饰:给被装饰对象(函数)添加功能
开放封闭原则:
开放:对扩展开放
封闭:对修改封闭
装饰器(被调用对象)必须遵循的两大原则:
1.不改变装饰对象(被装饰函数)的源码
2.不改变被装饰对象的调用方式
import time print(time.time()) # 1562812014.731474 时间戳 当前时间距离1970-1-1 00:00:00相差的秒数 # 1970-1-1 00:00:00是Unix诞生元年 time.sleep(3) # 让cpu谁三秒 让你的程序暂停三秒 print(‘FBI!‘)
统计func函数运行时间:
# 简单版: def func(): time.sleep(2) # 让cpu睡眠2秒 print(‘form func‘) star_res = time.time() func() over_res = time.time() print(‘运行时间: %s‘%(over_res - star_res)) # >>> 运行时间: 2.00064754486084 #此时的计算时间功能只能func函数单独使用,如果其他函数也要用到时间计算功能需要重新编写代码, # 可以把计算时间功能封装成一个函数给其他函数使用 #有装饰器版 def func(): time.sleep(2) # 让cpu睡眠2秒 print(‘form func‘) def outter(info): # info = 原始func的内存地址 def time_func(): star_res = time.time() info() # 相当于 func() 函数运行 over_res = time.time() print(‘运行时间: %s‘%(over_res - star_res)) return time_func func = outter(func) # 新 func = time_func的内存地址 func() # 相当于 time_func()函数运行 # >>> form func # >>> 运行时间: 2.0006558895111084
import time def index(): time.sleep(3) print(‘澳门最大线上赌场开业啦 性感tank在线发牌!‘) return ‘index‘ # res1 = index() def login(name): time.sleep(1) print(‘%s is sb‘%name) return ‘login‘ # res = login(‘egon‘) def outter(func): # func = 最原始的login函数的内存地址 def get_time(*args, **kwargs): # args = (‘egon‘,) kwargs = {} start = time.time() res = func(*args, **kwargs) # 最原始的login函数的内存地址() 直接调用 func(‘egon‘) end = time.time() print(‘func run time:%s‘%(end-start)) return res return get_time login = outter(login) # outter(最原始的login函数的内存地址) res = login(‘egon‘) print(res) # >>>egon is sb # >>>func run time:1.000328779220581 # >>>login index = outter(index) res1 = index() print(res1) # >>>澳门最大线上赌场开业啦 性感tank在线发牌! # >>>func run time:3.0011234283447266 # >>>index
在装饰器内,定义形参 *args ,**kwargs 可以接收有参无参函数
def func(): time.sleep(2) # 让cpu睡眠2秒 print(‘form func‘) return ‘函数func的返回值‘ def user(name): time.sleep(1) print(‘welcome %s‘%name) return ‘函数user的返回值‘ def outter(info): # info = 原始func的内存地址 # info = 原始user的内存地址 def time_get(*args,**kwargs): # args = ‘ ‘ # kwargs = ‘ ‘ 闭包函数的特性 star_res = time.time() res = info(*args,**kwargs) # 相当于 func() 函数运行 # 相当于user()函数运行,但函数user必须要传参才能执行 over_res = time.time() print(‘运行时间: %s‘%(over_res - star_res)) return res return time_get func = outter(func) # 新 func = time_get的内存地址 res_1 =func() # 相当于 time_get()函数运行 print(res_1) # res_1 = res = 函数func的返回值 # >>> form func # >>> 运行时间: 2.0006558895111084 # >>> 函数func的返回值 user = outter(user) # 新 user = rime_get 的内存地址 res_2 = user(‘wong‘) # 相当于 time_get()运行函数 print(res_2) # >>> welcome wong # >>> 运行时间: 1.000464677810669 # >>> 函数user的返回值
原文:https://www.cnblogs.com/waller/p/11171478.html