一:闭包函数:
定义:
#完整的闭包函数结构,嵌套调用
def func(): name = ‘eva‘ def inner(): print(name) return inner f = func() f()
内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数
#函数内部定义的函数称为内部函数
给函数体传值的方式 传参 def index(x,y): print(x,y) 给函数体传值的第二种方法 闭包 def outter(x,y): # 动态的绑定关系 # x=1 # y=2 def my_max(): if x>y: return x else: return y return my_max res1=outter(12,30) #res就是my_maxd函数的内存地址 print(res1())
爬虫:动态的修改网址 url(攻防的策略) import requests def my_get=(url): requests=requests.get(‘https//www.baidu.com‘) if requests.status_code==200: print(len(requests.text)) res=my_get(‘https//www.baidu.com‘) #修改地址即可 res1=my_get(‘https//www.baidu.com‘) res2=my_get(‘https//www.baidu.com‘) res3=my_get(‘https//www.baidu.com‘) res()
二、装饰器:
装饰器的本质:一个闭包函数(可调用的对象)
装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展(不修改被装饰对象的源代码和调用方式)
def timer(func): def inner(a): start = time.time() func(a) print(time.time() - start) return inner @timer def func1(a): print(a) func1(1)
1、装饰器的主要功能:
在不改变函数调用方式的基础上在函数的前、后添加功能。
import time print(time.time()) # 1562992535.343285 时间戳,当前的时间距离1970-1-1 00:00:00 Unix诞生的元年 time.sleep(3) # 让程序暂停3秒
2、装饰器的固定格式:
def timer(func): def inner(*args,**kwargs): ‘‘‘执行函数之前要做的‘‘‘ re = func(*args,**kwargs) ‘‘‘执行函数之后要做的‘‘‘ return re return inner
3、简单的装饰器:
""" 1.统计index函数执行的时间 """ import time def index(): time.sleep(3) print(‘澳门最大线上赌场开业啦!‘) def outter(func): # func = 最原始的index函数的内存地址 def get_time(): start = time.time() func() # func = index函数的内存地址() 直接调用 end = time.time() print(‘index run time:%s‘%(end-start)) return get_time index = outter(index) # outter(最原始的index函数内存地址) # index指向get_time函数的内存地址 index()
装饰器的流程图:统计index的执行时间
index和函数名 index没有任何关系 只是命名重复而已,加括号的就认为是函数的调用,优先级最高的
4、装饰器语法糖:
# 以此类推@outter2调用func1赋值给新的变量func2.......
多个装饰器装饰同一个函数
有些时候,我们也会用到多个装饰器装饰同一个函数的情况。
@outter # index = outter(index) outter(最原始的index的函数的内存地址) def index(): time.sleep(3) print(‘澳门最大线上赌场开业啦!‘) return ‘index‘ # res1 = index() @outter # login = outter(login) def login(name): time.sleep(1) print(‘%s is sb‘%name) return ‘login‘ # res = login(‘egon‘) @outter # home = outter(home) def home(*args,**kwargs): time.sleep(1) return ‘home‘ login = outter(login) # outter(最原始的login函数的内存地址) index = outter(index) home = outter(home) """ 语法糖在书写的时候应该与被装饰对象紧紧挨着 两者之间不要有空格 """
5、装饰器的固定格式:
def outter(func): def inner(*args,**kwargs): print(‘执行被装饰函数之前 你可以做的操作‘) res = func(*args,**kwargs) print(‘执行被装饰函数之后 你可以做的操作‘) return res return inner
原文:https://www.cnblogs.com/Gaimo/p/11179815.html