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
'''

4.4 小结:能够在 不修改源代码的基础上 添加额外的功能

posted @ 2020-08-04 11:40  爱编程_喵  阅读(99)  评论(0)    收藏  举报
jQuery火箭图标返回顶部代码

jQuery火箭图标返回顶部代码

滚动滑动条后,查看右下角查看效果。很炫哦!!

适用浏览器:IE8、360、FireFox、Chrome、Safari、Opera、傲游、搜狗、世界之窗.