# 生成器 generator
# 通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。
# 而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,
# 那后面绝大多数元素占用的空间都白白浪费了。
# 所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?
# 这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
# 要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:
l = [x * x for x in range(10)]
print(l) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# 1.定义生成器
g = (x * x for x in range(5))
print(g) # <generator object <genexpr> at 0x0000000002191660>
print(next(g)) # 0
print(next(g)) # 1
print(next(g)) # 4
print(next(g)) # 9
print(next(g)) # 16
# print(next(g)) # StopIteration
# generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,
# 没有更多的元素时,抛出StopIteration的错误。
# 另一种定义生成器的方法
# odd不是普通函数,而是generator,在执行过程中,遇到yield就中断,下次又继续执行。
# 执行3次yield后,已经没有yield可以执行了,所以,第4次调用next(o)就报错。
def odd():
print('step 1')
yield 1
print('step 2')
yield(3)
print('step 3')
yield(5)
g = odd()
while True:
try:
x = next(g)
print('g:', x)
except StopIteration as e:
print('Generator return value:', e.value)
break
# 2.遍历生成器
g = (x * x for x in range(5))
for n in g:
print(n)
(五)Python高级特性4:生成器 generator
最新推荐文章于 2018-12-01 12:51:34 发布