Python
中有个特殊的方法__iter__()
,若对象有个这个方法,说明是可迭代的。查看对象是否可迭代用hasatrr(list, "__iter__")
list1 = [1, 2, 3, 4]
iter_list1 = iter(list1)
iter_list1
结果:
<list_iterator at 0x1386893e898>
hasattr(list1, "__iter__")
hasattr(iter_list1, "__iter__")
iter_list1
那样的对象在Python
中称之为迭代器对象。迭代器对象必然是可迭代的。Python
中迭代器对象实现的是\__next__()
方法(Python2
中是next()
)。
手写迭代器对象
class MyRange:
def __init__(self, n):
self.i = 1
self.n = n
def __iter__(self):
return self
def __next__(self):
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)
print([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
- 编写的类
MyRange
具有__iter__
和__next__
两种方法 range
没有__next__
方法
image.png
斐波那契数列实现
class Fibs:
def __init__(self, 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))
[0, 1, 1, 2, 3, 5, 8]
理解
fib返回值
[0, 1, 1, 2, 3, 5, 8]
列表和元组解析式区别
image.png
image.png