Python可迭代对象、迭代器和生成器的区别

可迭代对象

实现了__iter__()的对象叫做可迭代对象

from typing import Iterable


class A:
    def __iter__(self):
        pass


print('可迭代对象', isinstance(A(), Iterable))  # 自定义对象
print('可迭代对象', isinstance('', Iterable))  # 字符串
print('可迭代对象', isinstance([], Iterable))  # 列表
print('可迭代对象', isinstance((), Iterable))  # 元组
print('可迭代对象', isinstance({}, Iterable))  # 字典
# 结果全为True

因为字符串、列表、元组、字典均实现__iter__(),所以也是可迭代对象。



迭代器

实现了__iter__()和__next__()的对象叫做迭代器

from typing import Iterable, Iterator


class B:
    def __iter__(self):
        pass

    def __next__(self):
        pass


print('可迭代对象', isinstance(B(), Iterable))
print('迭代器', isinstance(B(), Iterator))
# 结果全为True



生成器

包含了yield关键字的函数调用都是生成器,因为yield会自动创建__iter__()和__next__()

from typing import Iterable, Iterator, Generator


def f():
    yield


print('可迭代对象', isinstance(f(), Iterable))
print('迭代器', isinstance(f(), Iterator))
print('生成器', isinstance(f(), Generator))
# 结果全为True



区别

Python可迭代对象、迭代器和生成器的区别_第1张图片

可迭代对象和迭代器最大的区别——能否重复迭代

可迭代对象:能重复迭代,只能用for
迭代器:只能迭代一次,可以通过for或next()迭代



代码

判断可迭代对象:isinstance(?, Iterable)

判断迭代器:isinstance(?, Iterator)

判断生成器:isinstance(?, Generator)

综合对比

from typing import Iterable, Iterator, Generator


class A:
    '''可迭代对象'''

    def __iter__(self):
        pass


class B:
    '''迭代器'''

    def __iter__(self):
        pass

    def __next__(self):
        pass


def f():
    '''生成器'''
    yield


print('可迭代对象', isinstance(A(), Iterable))  # True
print('迭代器', isinstance(A(), Iterator))  # False
print('生成器', isinstance(A(), Generator))  # False
print()
print('可迭代对象', isinstance(B(), Iterable))  # True
print('迭代器', isinstance(B(), Iterator))  # True
print('生成器', isinstance(B(), Generator))  # False
print()
print('可迭代对象', isinstance(f(), Iterable))  # True
print('迭代器', isinstance(f(), Iterator))  # True
print('生成器', isinstance(f(), Generator))  # True



参考文献

  1. 函数式编程指引
  2. iterable(可迭代对象)和iterator(迭代器)的区别?
  3. 可迭代对象、迭代器和生成器
  4. Python可迭代对象,迭代器,生成器的区别

你可能感兴趣的:(Python)