python和它的迭代器
有代码如下:
class CountDown(object):
def __init__(self, step):
self.step = step
def __next__(self):
if self.step <= 0:
raise StopIteration
self.step -= 1
return self.step
def __iter__(self):
return self
if __name__ == '__main__':
for e in CountDown(4):
print(e)
当调用for时,
先调用了CountDown的 iter(),
每一次循环则调用了CountDown的 next()
这个过程就像下面一样
>>> i = iter('43210')
>>> next(i)
'4'
>>> next(i)
'3'
>>> next(i)
'2'
>>> next(i)
'1'
>>> next(i)
'0'
>>> next(i)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
python和它的生成器
如果要实现斐波那契数列,该如何实现呢?
不用生成器的话,会写下面的代码
def fibonacci(i):
if i == 1 or i == 2:
return 1
elif i > 2:
return fibonacci(i-1) + fibonacci(i-2)
else:
raise Exception('非法参数')
if __name__ == '__main__':
print(fibonacci(1))
print(fibonacci(2))
print(fibonacci(3))
for i in range(10):
print(fibonacci(4+i))
使用生成器的话,会写下面的代码
def fibonacci():
a, b = 0, 1
while True:
yield b
a, b = b, a + b
if __name__ == '__main__':
fib = fibonacci()
print(next(fib))
print(next(fib))
print(next(fib))
for _ in range(10):
print(next(fib))
其结果都是
1
1
2
3
5
8
13
21
34
55
89
144
233
基于yield语句,生成器可以暂停函数并返回一个中间结果。该函数会保存执行上下文,稍后在必要时可以恢复。
其中fib,是generator对象,一个特殊的迭代器。
摘自 《Python高级编程》