python笔记 可迭代对象和迭代器

127 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情

0 环境

  • 编辑器:idea或vscode
  • 系统版本:windows10
  • python版本:3.9.6

1 可迭代对象

可迭代对象拥有一个方法,当它有__iter__的对象时,就叫可迭代对象。

r = range(2)
print(r.__iter__)

image.png

2 迭代器

回顾常用的数据结构:列表、元组、字符串、集合、字典、字节、字节数组。而有__next__方法的可迭代对象叫迭代器。迭代器的标志是,可以使用next方法,而常用的数据类型无法调用__next__,但是我又想用这个迭代器,就需要一个媒介帮我们转化,iter函数就是干这事的,将可迭代对象转化迭代器。

迭代器的next函数从迭代器里取出下一个元素。如下只会取0,next函数指向第一个,因为初始化迭代器range。

print(next(iter(range(2))))
print(next(iter(range(2))))

image.png

迭代器的标志:既要有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)

image.png

5 总结

迭代器和可迭代对象,之前介绍过了,迭代器 = next(iter(可迭代对象)),每次next,保存当前元素,指向下一个元素。for...in,将我们的可遍历对象或者可迭代对象,先转成迭代器,每次next调用,直到抛出迭代停止异常,直接退出,异常我们是不会看到的。