欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python 可迭代对象-迭代器-生成器

程序员文章站 2024-01-15 12:42:22
...

python 可迭代对象-迭代器-生成器

迭代器的本质就是每次调用__next__()返回下个元素或抛出StopIteration的容器对象

迭代器对象可以调用close()方法关闭

只实现Iter方法(返回值类型需为迭代器类型), 为可迭代对象, 如列表、字典等

from collections.abc import Iterable, Iterator

class MyIteration:
    def __init__(self, n=10):
        self.n = n
        self.lst = range(n)

    def __iter__(self):
        return iter(enumerate(self.lst))

if __name__ == '__main__':
    for x in MyIteration(3):
        print(x)
        
    # """
    # (0, 0)
    # (1, 1)
    # (2, 2)
    # """
    print(isinstance(MyIteration(), Iterable))  # True
    print(isinstance(MyIteration(), Iterator))  # False

***注意***
class MyIteration3(object):
    """
    实现getitem方法的对象可以用于for-in循环,但非可迭代对象
    """
    def __init__(self, n=10):
        self.lst = range(n)

    def __getitem__(self, i):
        if i < len(self.lst):
            return self.lst[i]
        raise IndexError

if __name__ == '__main__':
    for x in MyIteration3(3):
        print(x)
        # """
        # 0
        # 1
        # 2
        # """
    print(isinstance(MyIteration3(), Iterable))  # False
    print(isinstance(MyIteration3(), Iterator))  # False

实现iter和next方法的对象,即迭代器对象

class MyIteration2:
    def __init__(self, n=10):
        self.n = n
        self.count = 0 # 迭代器的初始化条件,放在init和iter不同效果

    def __iter__(self):
        """
        执行for-in时,会调用此方法,如果把初始化条件放到此,迭代器就可以多次执行for循环
        如果放到init方法中,则每个迭代器对象只能做一次for-in操作
        所以按迭代器的特性,迭代初始条件应该放到init中
        :return:
        """
        return self # 只需要返回自身即可

    def __next__(self):
        while self.count <  self.n:
            result = self.count
            self.count += 1
            return result
        raise StopIteration

if __name__ == '__main__':
    it = MyIteration2(3)

    for x in it:
        print(x)

    # """
    # 0
    # 1
    # 2
    # """
    print(isinstance(MyIteration2(), Iterable))  # True
    print(isinstance(MyIteration2(), Iterator))  # True

生成器:是一种特殊的迭代器, 是迭代器类型的子集。即生成器一定是迭代器,迭代器不一定是生成器。

yield关键字把普通方法变为一个生成器(generator)
yield指令可以暂停一个函数并返回其中间结果,使用该指令的函数将保存执行环境,并在必要时恢复

def generation(n=10):
    for x in range(n):
        yield x

if __name__ == '__main__':
    g = generation(3)

    for x in g:
        print(x)
        # """
        # 0
        # 1
        # 2
        # """
    print(isinstance(generation(), Iterable))  # True
    print(isinstance(generation(), Iterator))  # True

生成器推导式

print(isinstance((x for x in range(2)), Iterable))  # True
print(isinstance((x for x in range(2)), Iterator))  # True
相关标签: python