Python札记39_迭代器

作者: 皮皮大 | 来源:发表于2019-07-10 23:12 被阅读2次

Python中有个特殊的方法__iter__(),若对象有个这个方法,说明是可迭代的。查看对象是否可迭代用hasatrr(list, "__iter__")

list1 =  [1, 2, 3, 4]
iter_list1 = iter(list1)
iter_list1   # 结果显示是迭代器对象
结果:
<list_iterator at 0x1386893e898>

hasattr(list1, "__iter__")    # True
hasattr(iter_list1, "__iter__")  # True
  • iter_list1那样的对象在Python中称之为迭代器对象。迭代器对象必然是可迭代的。Python中迭代器对象实现的是\__next__()方法(Python2中是next())。

手写迭代器对象

class MyRange:   # 定义一个类
    def __init__(self, n):  # 初始化函数,传入参数n;self就是一个实例对象,具有下面的各种属性
        self.i = 1   # 属性i的值为1
        self.n = n   # 属性n的值为n 
        
    def __iter__(self):  # 返回迭代器本身,一个实现了__iter__()方法的对象说明它就是可迭代的
        return self
    
    def __next__(self):  # 实现__next__()方法说明对象就是迭代器对象
        print("self.i", self.i)
        if self.i <= self.n:
            i = self.i
            self.i += 1
            return i
        else:
            raise StopIteration()
            
if __name__ == "__main__":
    x = MyRange(7)  # 建立实例化对象x,并且传入参数n=7
    print([i for i in x])   # 列表的形式显示
#     print(list(i for i in x))  同上功能

结果

self.i 1
self.i 2
self.i 3
self.i 4
self.i 5
self.i 6
self.i 7
self.i 8
[1, 2, 3, 4, 5, 6, 7]

解析

  • __init__函数实现初始化功能
  • _iter_函数返回迭代器本身
  • _next_函数中:
    • self.i表示迭代次数变量
    • 返回值是i
self.i(before) self.n i self.i(after)
1 7 1 2
2 7 2 3
3 7 3 4
4 7 4 5
5 7 5 6
6 7 6 7
7 7 7 8(停止迭代)
  • 编写的类MyRange具有__iter____next__两种方法
  • range没有__next__方法
    image.png

斐波那契数列实现

class Fibs:   # 定义一个类
    def __init__(self, max):  # 传入max参数
        self.max = max   # 三个属性,三个初始值
        self.a = 0
        self.b = 1
        
    def __iter__(self):   # 返回迭代器本身,说明是可迭代的
        return self
    
    def __next__(self):   # 迭代器对象
        fib = self.a
        if fib > self.max:
            raise StopIteration
        self.a, self.b = self.b, self.a + self.b
        return fib
    
if __name__ == "__main__":
    fibs = Fibs(9)
    print(list(fibs))
#     print([x for x in fibs])

[0, 1, 1, 2, 3, 5, 8]

理解

self.a(前) self.max fib self.a(后) self.b(前) self.b(后)
0 9 0 1 1 1
1 9 1 1 1 2
1 9 1 2 2 3
2 9 2 3 3 5
3 9 3 5 5 8
5 9 5 8 8 13
8 9 8 13 13 21
13 9 13 停止迭代

fib返回值
[0, 1, 1, 2, 3, 5, 8]


列表和元组解析式区别

  • 列表可以多次解析
  • 元组只能一次解析
image.png image.png

相关文章

网友评论

    本文标题:Python札记39_迭代器

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