持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情
0 环境
- 编辑器:idea或vscode
- 系统版本:windows10
- python版本:3.9.6
1 可迭代对象
可迭代对象拥有一个方法,当它有__iter__的对象时,就叫可迭代对象。
r = range(2)
print(r.__iter__)
2 迭代器
回顾常用的数据结构:列表、元组、字符串、集合、字典、字节、字节数组。而有__next__方法的可迭代对象叫迭代器。迭代器的标志是,可以使用next方法,而常用的数据类型无法调用__next__,但是我又想用这个迭代器,就需要一个媒介帮我们转化,iter函数就是干这事的,将可迭代对象转化迭代器。
迭代器的next函数从迭代器里取出下一个元素。如下只会取0,next函数指向第一个,因为初始化迭代器range。
print(next(iter(range(2))))
print(next(iter(range(2))))
迭代器的标志:既要有iter方法,也要有next方法。迭代器会保存一个指针,指向当前可迭代对象的元素。和c指针类似,指针保存当前元素,记录了下一个元素的位置。知道next抛出停止迭代的异常,说明已经没有元素了,之前文章写过,就不多写了。
3 for...in
for...in可以直接访问对象的。for...in循环过程:1、先调用iter方法,将可遍历对象转化为迭代器 2、不停的调用next方法,next遍历的对象 3、直到抛出停止迭代的异常,做异常处理后,直接退出。过程如下:
it = iter(可迭代对象)
while 真:
try:
next(it)
except 停止迭代:
// 结束
return
4 实战
怎么把它用在实战上呢,比如如下代码,不打印列表里的你好和hello这两个字符串。常规方法,运用切片的方式处理,但是我们用迭代器的方法就很容易做到,节省内存资源。
lists = [["你好", 1, 2, 3, 4], ["hello", 6, 7, 8, 9]]
for x in lists:
for y in x[1:]:
print(y)
for x1 in lists:
it = iter(x1)
next(it)
for y1 in it:
print(y1)
5 总结
迭代器和可迭代对象,之前介绍过了,迭代器 = next(iter(可迭代对象)),每次next,保存当前元素,指向下一个元素。for...in,将我们的可遍历对象或者可迭代对象,先转成迭代器,每次next调用,直到抛出迭代停止异常,直接退出,异常我们是不会看到的。