python 生成器

生成器 Generator (python 2.5及之后)
什么是生成器:
生成器是能够动态提供数据的对象,生成器对象也是可迭代对象(实例)

生成器有两种:
1. 生成器函数
2. 生成器表达式

生成器函数的定义
含有yield语句的函数是生成器函数,此函数被调用将返回一个生成器对象
yield 翻译为(产生或生成)

yield 语句
语法:
yield 表达式
说明:
yield 用于 def 函数中,目的是将此函数作用生成器函数使用
yield 用来生成数据,供迭代器的next(it) 函数使用

生成器函数说明:
生成器函数的调用将返回一个生成器对象,生成器对象是一个可迭代对象
在生成器函数调用return 会触发一个StopIteration异常

1,函数生成器

def myfactorial(n):
    s = 1
    x = 1
    sum = 1
    while s <= n:
        x = s
        sum *= x
        yield sum        #通过yield来生成结果,虽然现在一次性取出所有值,但实际上是需要时才立刻生成。
        s += 1

L = list(myfactorial(6))
print(L)

print(sum(myfactorial(5)))

输出结果:

tarena@tedu:~/zengsf$ python3 exercise821.py
[1, 2, 6, 24, 120, 720]
153

2,迭代式表达式个人感觉很好用,就是一个迭代推导式生成器表达式:

生成器表达式:
语法:
  (表达式 for 变量 in 可迭代对象 [if 真值表达式 ])
说明:
  if 子句可以省略
作用:
  用推导式的形式创建一个新的生成器

生成器函数生成的数据已经被取完,再次遍历将拿不到数据。

    gen = (x ** 2 for x in range(1, 5))
    it = iter(gen)
    next(it)  # 1
    next(it)  # 4
    next(it)  # 9
    next(it)  # 16
    next(it)  # StopIteration

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
L = [2, 3, 5, 7]
gen = (x**2+1 for x in L)
it = iter(gen)
for x in it:
    print(x)

输出结果:

tarena@tedu:~/zengsf$ python3 exercise821.py
5
10
26
50
原文地址:https://www.cnblogs.com/zengsf/p/9514787.html