当前位置 : 主页 > 编程语言 > python >

python3的可迭代对象与迭代器对象

来源:互联网 收集:自由互联 发布时间:2022-06-24
可迭代对象与迭代器对象 通过一段简单的代码来理解这俩个概念 a = [ 1 , 2 , 3 , 4 ] for i in a : print ( i ) 这段代码很简单, 对 a 这个列表进行遍历, 然后打印输出每个元素, 那么遍历具体进行

可迭代对象与迭代器对象

通过一段简单的代码来理解这俩个概念

a = [1,2,3,4]
for i in a:
print(i)

这段代码很简单, 对 a 这个列表进行遍历, 然后打印输出每个元素, 那么遍历具体进行了那些操作呢?

  • 首先需要确定 a(遍历的目标)要是一个可迭代对象
  • 如果 a 是一个可迭代对象, 就由 a 的内置方法​​__iter__()​​ 来生成一个迭代器对象, 这里在 python2 里面 字符串是没有​​__iter__()​​​ 方法的, 用​​__getitem__()​​​ 来代替, 不过 python3 已经统一为​​__iter__()​​ 了
  • 然后通过迭代器对象 调用​​__next__()​​​ 来遍历, Python2 中 通过迭代器对象来调用​​.next()​​ 方法
  • a = [1,2,3,4]
    iterator = a.__iter__() # 通过可迭代对象的 __iter__() 来生成一个迭代器对象
    print(next(iterator)) #调用内置函数的 next()
    print(next(iterator)) #或者 next.__next__()
    print(next(iterator))
    print(next(iterator))
    print(next(iterator))

    输出结果:

    1
    2
    3
    4
    Traceback (most recent call last):
    File "/home/wshuo/Desktop/python3高级用法/test.py", line 7, in <module>
    print(next(iterator))
    StopIteration

    当调用到最后的时候 抛出了一个 ​​StopIteration​​ 的报错, for循环就是通过这个报错来停止迭代的

    下面一个小例子, 我们自己写一个 可迭代对象和迭代器对象

    from collections import Iterable, Iterator

    # 自定义了一个迭代器对象, 继承迭代器对象
    class MeIterator(Iterator):
    def __init__(self, num_list):
    self.num_list = num_list
    self.index = 0

    def control(self,n):
    s = n +1
    return s

    # 自定义 __next__()方法, 为了for 循环调用
    def __next__(self):
    if self.index == len(self.num_list):
    raise StopIteration

    result = self.control(self.num_list[self.index])
    self.index += 1
    return result

    # 自定义一个可迭代对象,继承可迭代对象
    class MeIterable(Iterable):

    def __init__(self, num_list):
    self.num_list = num_list

    # 通过__iter__方法返回迭代器对象
    def __iter__(self):
    return MeIterator(self.num_list)

    # 测试程序
    for i in MeIterable([1, 2, 3]):
    print(i)

    输出结果:

    2
    3
    4

    这里其实也可以不去继承 Iterable 和 Iterator 这俩个类, 不过需要在你自定义的 生成器 里面 加上 ​​__iter__()​​ 方法, 然后返回自身, 因为不仅是 可迭代对象有这个接口, 迭代器也有这个接口, 而继承了 Iterator 就不需要写这个接口了


    本文来自博客园,作者:​​Hello_wshuo​​​,转载请注明原文链接:​​javascript:void(0)p/15622267.html​​


    【本文来源:美国服务器 https://www.68idc.cn 复制请保留原URL】
    上一篇:tesseract-orc训练 结合python3图像识别验证码
    下一篇:没有了
    网友评论