0
点赞
收藏
分享

微信扫一扫

3.生成器

苦茶如歌 2022-04-24 阅读 67
python

1.什么是生成器


生成器是一种特殊的迭代器

2.案例


常见的生成器:  --- 元组推导式  
data = (i for i in range(10))
print(type(data))  # <class 'generator'>

# generator  生成器

3.迭代协议与自定义得迭代器

原型了解即可

class Cycle:
    def __init__(self, elem, n):
        self.elem = elem
        self.n = n

    def __iter__(self):   # iter()触发
        elem = self.elem   # 数据
        n = self.n    # 数据量

        class CycleInter:
            def __init__(self):
                self.count = 0  # 迭代器内剩下的数据量

            def __next__(self):    # next()触发
                if self.count < n:
                    self.count = 1
                    return elem
                else:
                    raise StopIteration

            def __iter__(self):
                return self
        return CycleInter()   # 返回迭代器

自己实现迭代器那么首先得写迭代协议


class TesIter:
    """
        自定义迭代器
    """
    def __init__(self, li):
        self.li = li
        self.index = 0

    def __iter__(self):   # iter()触发
        return self

    def __next__(self):
        if self.index < len(self.li):
            data = self.li[self.index]
            self.index += 1
            return data
        else:
            raise StopIteration


a = TesIter([1, 2, 3, 4, 5, 'hha'])
print(type(a))  # <class '__main__.TesIter'>

print(next(a))
print(next(a))
print(next(a))
print(next(a))
print(next(a))
print(next(a))


4.生成器与yield


生成器很重要的就是yield

"""

特征:
    类似函数逻辑
    支持显式的暂停与恢复
    隐性的支持迭代协议
    

yeild一个对象
    返回这个对象
    暂停这个函数
    等待下一次next的激活调用

"""

# 简化案例
def demo():
    print('第一次执行')
    yield 1

    print('第二次执行')
    yield 2


s = demo()

v1 = next(s)
print(v1)

v2 = next(s)
print(v2)


# 进阶案例
def cycle(elem):
    count = 0
    n = len(elem)
    while True:
        if count < n:
            data = elem[count]
            count += 1
            yield data
        else:
            break


a = cycle('数据')
print(next(a))
print(next(a))

举报

相关推荐

0 条评论