美文网首页
python学习笔记之--迭代器

python学习笔记之--迭代器

作者: itsenlin | 来源:发表于2021-12-08 00:56 被阅读0次

前面学习循环时知道,for循环是通过访问可迭代对象来实现循环的,这里详细讨论下迭代器以及可迭代对象相关的内容

概念

  • 迭代器: 是一种迭代获取元素的工具,不依赖于索引的迭代方式,而是通过next()接口获取下一个元素
  • 可迭代对象:实现了__iter__方法的对象称为可迭代对象;像列表类型对象(list、str、tuple)、字典类对象、集合类对象、文件对象

注意:迭代过程中不能修改迭代对象,因为迭代过程中记录迭代到的元素位置

工作原理

  1. 通过iter()接口获取一个迭代器,参数为可迭代对象
  2. 通过next()接口获取下一个迭代元素,参数为上一步获取的迭代器对象
  3. 当迭代结束时会返回一个StopIteration异常
>>> a = [1, 2, 3, 4, 5]
>>> it = iter(a)
>>> next(it)
1
>>> next(it)
2
>>> next(it)
3
>>> next(it)
4
>>> next(it)
5
>>> next(it)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>

for循环比较智能,可以自动调用iter()next();并且自动捕获StopIteration异常,所以在for循环中不需要主动捕获StopIteration异常

>>> for item in a:
...     print(item, end=' ')
... 
1 2 3 4 5 >>> 

生成器

python中的关键字yield只能用在函数中,当函数运行到yield语句时会暂停运行,并返回一个生成器对象,而生成器对象本质上也是一个迭代器对象,当调用next()的时候,函数会继续执行后面的代码

#!/usr/bin/python

def fun():
    a, b = 0, 10
    while b > 0:
        yield a
        a += 1
        b -= 1

it = fun()
for i in it:
    print(i, end=' ')
print('')

输出结果为:

itsenlin@itsenlin-PC:~/Desktop/python_test$ /usr/local/bin/python3.9 /home/itsenlin/Desktop/python_test/helloworld.py
0 1 2 3 4 5 6 7 8 9 
itsenlin@itsenlin-PC:~/Desktop/python_test$

自定义迭代器对象

根据前面讲解,只要实现__iter____next__方法就可以实现一个自定义的迭代器对象,如下(这里参考python3教程章节

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
 
  def __next__(self):
    if self.a <= 20:
      x = self.a
      self.a += 1
      return x
    else:
      raise StopIteration
 
myclass = MyNumbers()
myiter = iter(myclass)
 
for x in myiter:
  print(x)

相关文章

网友评论

      本文标题:python学习笔记之--迭代器

      本文链接:https://www.haomeiwen.com/subject/ytuzxrtx.html