为什么生成器(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
相关产品推荐
相关产品推荐

