# Python教程系列之学 Python 怎能不知 yield？

XAMPP案例 972浏览

### yield 的概念

#### 如何生成斐波那契數列

``````def createNum(count):
n, a, b = 0, 0, 1
while n < count:
print b
a, b = b, a + b
n = n + 1
createNum(5)
``````

``````1
1
2
3
5
``````

``````def createNum(count):
n, a, b = 0, 0, 1
L = []
while n < count:
L.append(b)
a, b = b, a + b
n = n + 1
return L

for n in createNum(5):
print n
``````

``````1
1
2
3
5
``````

``````def createNum(count):
n, a, b = 0, 0, 1
while n < count:
yield b      # 使用 yield
# print(b)
a, b = b, a + b
n = n + 1

for n in createNum(5):
print n
``````

``````def createNum(count):
n, a, b = 0, 0, 1
while n < count:
yield b      # 使用 yield
# print(b)
a, b = b, a + b
n = n + 1

#使用for循环来执行createNum()函数，它返回一个迭代值，下次迭代从yield语句的下一条语句继续执行
<!--for n in createNum(5):
print n-->

#使用next方法来执行createNum()函数，generator（生成器）对象具有next()方法
num = createNum(5)
print(next(num))
print(next(num))
print(next(num))
print(next(num))
print(next(num))
print(next(num))
``````

``````1
1
2
3
5
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
``````

### yield 使用场景

• 迭代生成数据(生产者，数据量巨大时优势更加明显，它可以不占用大量内存)
• 接收数据(消费者)
• 中断(协作式的任务)

### 总结

yield 的好处是显而易见的，把一个函数改写为一个 generator 就获得了迭代能力，比起用类的实例保存状态来计算下一个 next() 的值，不仅代码简洁，而且执行流程异常清晰。