Justin-刘清政的博客

python/面向对象高阶/14-实现迭代器(__next__和__iter__)

2020-12-21

一、简单示例

  • 死循环
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Foo:
def __init__(self, x):
self.x = x

def __iter__(self):
return self

def __next__(self):
self.x += 1
return self.x


f = Foo(3)
for i in f:
print(i)

二、StopIteration异常版

  • 加上StopIteration异常
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Foo:
def __init__(self, start, stop):
self.num = start
self.stop = stop

def __iter__(self):
return self

def __next__(self):
if self.num >= self.stop:
raise StopIteration
n = self.num
self.num += 1
return n


f = Foo(1, 5)
1
2
from collections import Iterable, Iterator
print(isinstance(f, Iterator))
1
True
1
2
for i in Foo(1, 5):
print(i)
1
2
3
4
1
2
3
4

三、模拟range

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Range:
def __init__(self, n, stop, step):
self.n = n
self.stop = stop
self.step = step

def __next__(self):
if self.n >= self.stop:
raise StopIteration
x = self.n
self.n += self.step
return x

def __iter__(self):
return self


for i in Range(1, 7, 3):
print(i)
1
2
1
4

四、斐波那契数列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Fib:
def __init__(self):
self._a = 0
self._b = 1

def __iter__(self):
return self

def __next__(self):
self._a, self._b = self._b, self._a + self._b
return self._a


f1 = Fib()
1
2
3
4
for i in f1:
if i > 100:
break
print('%s ' % i, end='')
1
1 1 2 3 5 8 13 21 34 55 89
使用支付宝打赏
使用微信打赏

点击上方按钮,请我喝杯咖啡!

扫描二维码,分享此文章