You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么生成器(Generators)可耗尽,而列表/元组(Lists/Tuples)不可耗尽?

嘿,我懂你查了一堆SO帖子还是没捋清楚的感觉!我来给你把Iterable和Iterator这俩概念掰得明明白白~

什么是Iterable(可迭代对象)?
  • 简单来说,像Lists(列表)、Tuples(元组)、Sets(集合)这类能装下一堆元素、并且允许被挨个遍历的容器对象,就是Iterable。你可以把它看成一个装满物品的储物箱,它本身具备“能被遍历”的属性,但不会主动把里面的元素递出来。
那Iterator(迭代器)是干嘛的?
  • 要遍历Iterable里的元素,就得靠Iterator这个“专属取件员”!整个遍历过程的核心是__iter__()方法:当你对一个Iterable调用这个方法时,它会返回对应的Iterator对象。
  • 拿到这个Iterator后,你就可以通过__next__()方法(或者Python内置的next()函数)来逐个取出元素,直到所有元素都取完,此时会抛出StopIteration异常,告诉你“没东西可取啦”。
用代码直观感受一下
# 先定义一个Iterable(比如列表)
my_fruits = ["apple", "banana", "orange"]
# 获取它的Iterator对象
fruit_iterator = my_fruits.__iter__()
# 或者用内置函数iter(),效果完全一样
# fruit_iterator = iter(my_fruits)

# 逐个取出元素
print(next(fruit_iterator))  # 输出: apple
print(next(fruit_iterator))  # 输出: banana
print(next(fruit_iterator))  # 输出: orange
print(next(fruit_iterator))  # 这里会抛出StopIteration异常,元素已经取完啦
额外补充个小知识点
  • 有意思的是,Iterator本身也是Iterable!因为Iterator也实现了__iter__()方法,它返回的就是自己。所以你也可以直接用for循环遍历Iterator,for循环会自动帮你处理next()调用和异常捕获的工作,不用你手动写这些逻辑~

内容的提问来源于stack exchange,提问作者Rohit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:11:51