Python学习(七) —— 装饰器、迭代器、生成器
一、装饰器(decorator)
1.装饰器的本质是闭包函数,作用:在不改变函数的调用方式的情况下,给函数的前后添加新的功能
#装饰器的固定结构 def warpper(func): #定义装饰器函数 def inner(*args,**kwargs): #定义内部函数 # 函数执行前的代码 #添加新功能 ret = func(*args,**kwargs) #执行被装饰的函数 # 函数执行后的代码 #添加新功能 return ret #返回被装饰的函数 return inner #返回内部函数名 @wrapper #==> func1 = warpper(func1) #执行装饰器函数并返回内部函数名给func1 def func1(): pass func1() #执行内部函数
2.开放封闭原则:1.对扩展是开放的
2.对修改是封闭的
装饰器完美的遵循了这个开放封闭原则
3.多个装饰器装饰同一个函数
def wrapper1(func): def inner(*args,**kwargs): print(1) func(*args,**kwargs) print(2) return inner def wrapper2(func): def inner(*args,**kwargs): print(3) func(*args,**kwargs) print(4) return inner @wrapper1 @wrapper2 def f1(): print(123)
二、迭代器(iterator)
可迭代的:iterable,必须含有__iter__()方法 #可迭代协议
迭代器:iterator,必须含有__iter__()、__next__()方法 #包含__next__方法的可迭代对象就是迭代器
迭代器是可迭代的一部分
获得迭代器:可迭代的调用__iter__()方法
使用迭代器:迭代器调用__next__()方法
迭代器的特点:惰性运算、从前到后一次去取值,过程不可逆、节省内存空间
a = 'abcde' #a是可迭代对象 b = a.__iter__() #获得迭代器 print(b.__next__()) #a print(b.__next__()) #b
判断一个变量是不是迭代器或者可迭代的:
1.判断这个变量是否含有__iter__()、__next__()方法
print('__iter__' in dir(变量))
print('__next__' in dir(变量))
2.判断这个变量是否是迭代器或者可迭代的
from collections import Iterable
print(isinstance(变量,Iterable)
from collections import Iterator
print(isinstance(变量,Iterator))
print('__iter__' in dir(range(20))) #True #range(20)是可迭代的
print('__next__' in dir(range(20))) #False #range(20)不是迭代器
range_iter = range(20).__iter__() #获得迭代器
from collections import Iterable
print(isinstance(range_iter,Iterable)) #True
from collections import Iterator
print(isinstance(range_iter,Iterator)) #True
#用while循环模拟for循环 li = [1,2,3,4] li_iter = li.__iter__() #生成迭代器 while True: try: print(li_iter.__next__()) #使用迭代器 except StopIteration: #遇到异常break break
三、生成器(generator)
生成器的本质是迭代器,因此生成器的所有好处都和迭代器一样
生成器的实现有两种方法:1.生成器函数:常规定义函数,但是使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,下次在这个地方执行
2.生成器表达式
def generator_func(): #定义一个函数 print('a') yield 1 print('b') yield 2 g = generator_func() #返回一个生成器,不执行函数的任何内容 print('abc') #abc print(next(g)) #a\n1 print(next(g)) #a\n2