Iterable和Iterator

本文探讨了可迭代对象(Iterable)与迭代器(Iterator)的概念。可迭代对象包括list、tuple、dict、set、str和生成器,可以用isinstance()判断其可迭代性。而迭代器可通过next()函数获取序列中的下一个元素,但list、dict、str等虽是Iterable,却不是Iterator。使用iter()函数可将这些Iterable转化为Iterator。Python的for循环依赖于迭代器的next()函数,其执行过程是惰性的,仅在需要时计算下一个数据,这使得Iterator能处理无限大或不可预知长度的数据流。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可以直接作用于for循环的数据类型:

①集合数据类型:list、 tuple、 dict、 set、 str

②generator:生成器、带有yield的generator function

这些可以直接作用于for循环的对象统称为可迭代对象:Iterable

可以使用 isinstance()判断一个对象是否是 Iterable 对象,实例如下:

#   _*_ coding:utf-8 _*_
from typing import Iterable

__author__ = 'admin'

g = (x for x in range(10))
print(isinstance(g, Iterable))

输出结果:True

#   _*_ coding:utf-8 _*_
from typing import Iterable

__author__ = 'admin'

g = []
print(isinstance(g, Iterable))

输出结果:True

 

可以被 next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

可以使用 isinstance()判断一个对象是否是 Iterator对象,实例如下:

 

#   _*_ coding:utf-8 _*_
from typing import Iterable, Iterator

__author__ = 'admin'

g = (x for x in range(10))
print(isinstance(g, Iterator))

输出结果:True

#   _*_ coding:utf-8 _*_
from typing import Iterable, Iterator

__author__ = 'admin'

g = []
print(isinstance(g, Iterator))

输出结果:False

总结:

①生成器都是Iterator 对象

②list、 dict、 str 虽然是 Iterable,却不是Iterator

③如何把 list、 dict、 str 等 Iterable 变成 Iterator呢?答案是iter()函数,实例如下:

#   _*_ coding:utf-8 _*_
from typing import Iterable, Iterator

__author__ = 'admin'

print(isinstance(iter([]), Iterator), isinstance(iter('abc'), Iterator))

输出结果:True True

回到问题“为什么list、dict、str不是Iterator呢?”

①Python 的 Iterator 对象表示的是一个数据流

②这个数据流是一个不能提前被知道序列长度的有序序列

③只能不断通过 next()函数实现按需计算下一个数据

 

④Iterator 的计算是惰性的,只有在需要返回下一个数据时它才会计算

 

⑤Iterator甚至可以表示一个无限大的数据流,例如全体自然数。这一点list就办不到

 

******Python 的 for 循环本质上就是通过不断调用 next()函数实现的*******

#   _*_ coding:utf-8 _*_
__author__ = 'admin'

for x in [1, 2, 3, 4, 5]:
    print(x)

等同于迭代器写法:

#   _*_ coding:utf-8 _*_
__author__ = 'admin'

it = iter([1, 2, 3, 4, 5])

while True:
    try:
        x = next(it)
        print(x)
    except StopIteration:
        break

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值