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




区别

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

可迭代对象:能重复迭代,只能用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




其他

from typing import Iterable

可换成

from collections.abc import Iterable




参考文献

  1. 函数式编程指引
  2. iterable(可迭代对象)和iterator(迭代器)的区别?
  3. 可迭代对象、迭代器和生成器
  4. Python可迭代对象,迭代器,生成器的区别
  5. collections.Iterable vs typing.Iterable in type annotation and checking for Iterable
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XerCis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值