python -- 生成器

一、生成器(generator)

在Python中,使用了yield的函数被称为生成器。

生成器是一种特殊的迭代器,只能用于迭代操作。

生成器中保存的是算法,每次调用next(),就计算出下一个元素的值,直到计算到最后一个元素,没有更多元素时,抛出StopIteration异常。

不需要去创建一个完整而庞大的列表,一边循环一边计算,在数据量特别大的时候,能节约大量的内存。

生成器也是可迭代对象,正确方法是使用for循环来遍历,并且不需要去关心StopIteration异常的处理。

但是使用for循环遍历生成器时,拿不到生成器return的返回值。

如果想要拿到返回值,就必须得捕获StopIteration错误,然后取出错误实例中的value值。(try ..... except)

# -----------------------------------------
# 生成器(generator):使用了yield的函数
# -----------------------------------------
# 偶数生成器
def even():
print('2')
yield 2
print('4')
yield 4
print('6')
yield 6
print('8')
yield 8

return 'OK'


# 生成一个生成器对象
e = even()
# 用while语句+next()方法遍历生成器
while True:
try:
# 使用next生成并取出一个元素
print('while:', next(e))
except StopIteration as e:
print('迭代结束!')
# 生成器的返回值包含在StopIteration实例的value中
print(e.value)
break

# 用for...in语句遍历生成器
for e in even():
print('for:', e)
print()


# 自定义一个生成器
def my_yield(n):
num = 0
while n > 0:
num += 1
yield n * 2
n -= 1
return '生成了%d个值' % num


# 用for...in语句遍历生成器
for i in my_yield(5):
print("for遍历值:", i)
print()

# 用while语句+next()方法遍历生成器
yy = my_yield(5)
while True:
try:
print("while遍历值:", next(yy))
except StopIteration as e:
print(e.value)
break
原文地址:https://www.cnblogs.com/Teachertao/p/11229200.html