Python札记39_迭代器

浏览: 934

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
    • image.png
  • 编写的类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]

理解

image.png

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


列表和元组解析式区别

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

image.png

image.png

推荐 0
本文由 皮大大 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册