生成器:
在Python中, 这种一边循环一边计算的机制, 称为生成器:generator
列表生成式:L(list) = [x * x for x in range(10)]
生成器: g(generator) = (x * x for x in range(10))
在Python中, 这种一边循环一边计算的机制, 称为生成器:generator
列表生成式:L(list) = [x * x for x in range(10)]
生成器: g(generator) = (x * x for x in range(10))
调用该generator时, 首先要生成一个generator对象, 然后用 next() 函数不断获得下一个返回值
斐波拉契数列函数:
def fib(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a , b = b, a + b
n = n + 1
return 'done'
斐波拉契数列generator:
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done'
这
就是定
义
generator
的
另
一种方法。 如果一个函数定
义
中包含
yield
关
键
字, 那么
这
个函数就不再是一个普通函数, 而是一个
generator
。
这里, 最难理解的就是generator和函数的执行流程不一样。 函数是顺序执行, 遇到 return 语句或者最后一行函数语句就返回。 而变成generator的函数, 在每次调用 next() 的时候执行, 遇到 yield 语句返回, 再次执行时从上次返回的 yield 语句处继续执行。
杨辉三角函数:
def triangles():
n = 1
N = [1]
while True:
print(N)
N.append(0)
N = [N[i-1] + N[i] for i in range(len(N))]
n = n + 1
if n >10:
break
结果:
>>>>triangles()
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
杨辉三角generator函数:
def triangles():
p = [1]
while True:
yield p
p = [1] + [p[i] + p[i+1] for i in range(len(p)-1)] + [1]