什么是迭代器
迭代器的作用:访问容器中的元素
首先要了解什么是Iterable
lterable(可迭代的)
字符串、列表、元组、字典都是lterable,都可以放到for循环语句中遍历
lterable类型的定义中一定有一个_iter_方法iter 方法必须返回一个lterator(迭代器)·
可以对lterable调用内置函数iter,本质就是调用Iterable内部的 iter 方法,得到一个迭代
iterator
lterator继承了lterable,所以lterator一定是可迭代的对象,反之则不然。
lterator类型的定义中一定有一个_next__方法next 方法用于返回lterator中的下一个值
·可以对lterator调用内置函数next,本质就是调用Iterator内部的next方法·当lterator所有值都已经取完,再对其调用next时,会抛出Stoplteration异常
from typing import Iterable,Iterator
name = "王麻子"
girlfrilends = ["照明", "小赵", "走直落"]
print(isinstance(name, Iterator)) # 判断name是否是Iterator类型
print(isinstance(girlfrilends, Iterator)) # 判断girlfrilends是否是Iterator类型
print(isinstance(name, Iterable)) # 判断name是否是Iterable类型
print(isinstance(girlfrilends, Iterable)) # 判断girlfrilends是否是Iterable类型
运行结果
# 对可迭代对象Iterable调用内置的函数iter,获取他的迭代器
i1 = iter(name)
print(i1, isinstance(i1, Iterator))
i2 = iter(girlfrilends)
print(i2, isinstance(i2, Iterator))
运行结果:
# 可以对迭代器调用next内置函数,获取其中的下一个值
print(next(i1), end="")
print(next(i1), end="")
print(next(i1), end="")
print(next(i1), end="") # 当迭代器中无值可以迭代后,再调用next函数,会抛出StopIteration异常
运行结果:
# 自定义迭代器
"""
自定义迭代器Iterator
本质上:就是定义一个类,这个类中必须定义__iter--、--next-设计:
书架类(迭代器),对书架进行迭代,可以每次返回一本书
"""
from typing import Iterable,Iterator
class BookShelf:
def __init__(self):
self.books = ["西游记", "水浒传", "红楼梦", "三国演义"]
self.curr_index = -1 # 当前已经迭代到的值的索引
def __iter__(self):
"""用于返回迭代器"""
return self
def __next__(self):
if self.curr_index == len(self.books)-1:
raise StopIteration
self.curr_index += 1
print(self.curr_index)
return self.books[self.curr_index]
if __name__ == '__main__':
bs = BookShelf()
print(bs, isinstance(bs, Iterable))
print(bs, isinstance(bs, Iterator))
for i in bs:
print(i)
print(next(bs))
print(next(bs))
print(next(bs))
print(next(bs))
print(next(bs)) # 调用的时候索引为3
运行结果: