Python 三器一闭
前言
三器一闭
迭代器 &&生成器 &&装饰器&& 闭包
1 可迭代对象
实现了iter() 的对象就是可迭代对象(能够使用for关键字的对象)
from collection.abc import Iterable
li = [1, ]
print(isinstance(li, Iterable)) # >>>True
1.1 迭代器
实现__iter__ 和 __next__方法的对象就是迭代器
class Iterator(object):
def __init__(self, a):
self.list1 = a
self.n = len(self.list1) - 1 # 记录迭代器获取数据的初始位置
def __iter__(self):
return self
def __next__(self):
if 0 <= self.n <= len(self.list1):
data = self.list1[self.n]
self.n -= 1
return data
else:
self.n = len(self.list1) - 1
raise StopIteration
a = Iterator([1, 2, 3, 4, 5])
for s in a:
print('迭代器获取的数据------', s)
1.2 for 循环
for 循环实质存在异常捕获 并且针对可迭代对象 优先使用iter函数 完成迭代器的创建 再通过next函数对迭代器数据提取
最后是通过捕获异常 完成对数据流的控制
2.生成器
2.1. 方式一 元组推导式
li = (i for i in range(3))
print(type(li)) # >>> <class 'list'> [0, 1, 2, ]
2.2 方式二 def函数模块 yield 关键字
def test():
n1 = 1
n2 = 1
while True:
temp = n1
n1, n2 = n2, n1 + n2
yield temp
t = test()
print(type(t)) # >>><class 'generator'>
2.3 小结:生成器是特殊的迭代器 按照一定的算法生成数据
3 闭包
3.1 定义:嵌套函数 + 内部函数调用了外部函数参数 + 外部函数返回值为内部函数引用
def outer(n):
def inner():
# 若需要修改外部函数参数
# nonlocal n
# n += 1
print(n)
return inner
a = outer(1)()
3.2 应用 装饰器 权限验证 数据多重处理流程
4 装饰器
4.1 闭包 装饰器
def outer(fn):
def inner():
fn()
return inner
@outer
def test():
print('test ...')
t = test() # 实质 t = outer(test)()
4.2 类装饰器
class Test(object):
def __init__(self, fn):
self.__fn = fn
def __call__(self):
self.__fn()
@Test
def test():
print('test ....')
t = test() # 实质 t指向一个实例对象>Test(test) 初始化test引用当作参数传递fn call()回调自身
4.3 多个装饰器装饰
def o1(fn):
print('o1___1')
def i1():
print('i1___2')
fn()
return i1
def o2(fn):
print('o2___1')
def i2():
print('i2___2')
fn()
return i2
@o1 # 3
@o2 # 2
def test(): # 1
print('test____0')
test() # 实质装饰顺序 2-3-3-2-1
'''
>>>
o2___1
o1___1
i1___2
i2___2
test____0
'''

浙公网安备 33010602011771号