一、闭包函数
1、定义:函数内部定义函数,成为内部函数。该内部函数包含对外部作用域,而不是对全局作用域名字的引用,那么该内部函数成为闭包函数
name='alex' def func(): name='egon' def bar(): print(name) return bar b=func() print(b)
2、闭包函数特点:自带作用域、包含对外部作用域而非全局作用域的引用
包一层 def wrapper(): money=1000 def tell_info(): print('egon have money %s' %money) return tell_info tell_info=wrapper() tell_info()
包二层 def aaa(): name='egon' def wrapper(): money=1000 def tell_info(): print('egon have maney %s'%(money)) print('my name is %s'%(name)) return tell_info return wrapper w=aaa() tell_info=w() tell_info()
3、定义闭包函数的基本形式
外部函数名():
内部函数需要的变量
def 内部函数():
引用外部变量
return 内部函数
def deco(): x=1 def wrapper(): print(x) return wrapper wrapper=deco() print(wrapper)
二、装饰器
1、开放封闭原则,对拓展是开放的,对修改的封闭的
2、装饰器,本质可以任意调用对象,被装饰的对象也可以是任意可调用对象
3、功能:在不修改被装饰对象源代码以及调用方式的前提下为其添加新功能
原则:不修改源代码、不修改调用方法。 目标:添加新功能
# import time # import random # #装饰器 # def timmer(func): # # func=index # def wrapper(): # start_time = time.time() # func() #index() # stop_time=time.time() # print('run time is %s' %(stop_time-start_time)) # return wrapper # #被装饰函数 # def index(): # time.sleep(random.randrange(1,5)) # print('welecome to index page') # # def home(): # time.sleep(random.randrange(1,3)) # print('welecome to HOME page') # # index=timmer(index) #index=wrapper # home=timmer(home) # # index() #wrapper() # home()
装饰器语法:在被装饰对象的正上方的单独一行,@装饰器的名字
三、迭代器
1、定义:迭代器对象要求支持迭代器协议的对象,支持迭代器协议就是实现对象的__iter__()和next()方法。其中__iter__()方法返回迭代器对象本身;next()方法返回容器的下一个元素,在结尾时引发StopIteration异常。
2、__iter__()和next()方法,这两个方法是迭代器最基本的方法,一个用来获得迭代器对象,一个用来获取容器中的下一个元素。
d={'a':1,'b':2,'c':3} i=d.__iter__() #i叫迭代器 print(i) print(i.__next__()) print(i.__next__()) print(i.__next__()) print(i.__next__()) #StopIteration
3、迭代器的优点:提供了一种不依赖于索引的取值方式,节省内存
迭代器的缺点:取值不如按照索引取值方便、一次性的,只能往后走不能往前退、无法获取长度