#
# 迭代器
# 使用 [x * x for x in range(size)] 方式创建列表时,内存中一
# 下生成了指定大小的空间,若size很大,则会非常耗费内存空间,但如果使用
# 迭代器,每次需要时便获取一个,会节省空间,而且会延迟计算 x*x
generator=( x*x for x in range(5) )
print generator
print generator.next()
print generator.next()
print generator.next()
print generator.next()
print generator.next()
print generator.next()
#
# 打印如下
# <generator object <genexpr> at 0x102bd1b90>
# 0
# 1
# 4
# 9
# 16
# Traceback (most recent call last):
# File "/Users/young/Documents/workspace_python/python1/src/main.py", line 17, in <module>
# print generator.next()
# StopIteration
# 当第6次调用next时会报错,因为已经指定了是5
generator=( x*x for x in range(5) )
# 当然也可以按如下方式遍历
for ele in generator:
print ele
# 打印如下
# 0
# 1
# 4
# 9
# 16
# 迭代函数
# 如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:
# generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
gene=fib(8)
print gene.next()
print gene.next()
print gene.next()
print gene.next()
print gene.next()
print gene.next()
print gene.next()
print gene.next()
print gene.next()
# 打印如下
# 1
# 2
# 3
# 5
# 8
# 13
# 21
# Traceback (most recent call last):
# File "/Users/young/Documents/workspace_python/python1/src/main.py", line 25, in <module>
# print gene.next()
# StopIteration
# 再例如
def odd():
print 'step 1'
yield 1
print 'step 2'
yield 3
print 'step 3'
yield 5
ge=odd()
ge.next()
ge.next()
ge.next()
ge.next()
打印如下
step 1
step 2
step 3
Traceback (most recent call last):
File "/Users/young/Documents/workspace_python/python1/src/main.py", line 18, in <module>
ge.next()
StopIteration