知识点:
- 将一个列表生成式的
[]
改成()
,就创建了一个generator(生成器); - 如果一个函数定义中包含
yield
关键字,那么这个函数就不再是一个普通函数,而是一个generator; - 普通函数调用直接返回结果,而 generator 的 “调用” 实际返回一个 generator 对象;
- generator 的返回值可以通过 next() 调用,每次调用,都返回生成器下一个元素的值,直至最后一个元素,没有更多元素时,抛出
StopIteration
的错误; - generator 和 函数的执行流程不一样,函数是顺序执行,遇到
return
语句或者最后一行函数语句就返回。而 generator ,在每次调用next()
的时候执行,遇到yield
语句返回,再次执行时从上次返回的yield
语句处继续执行; - generator 也是一个可迭代对象,可以使用 for 循环返回生成器的值;
杨辉三角:
1、个人版
生成器部分代码:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
def triangles():
L = [1]
yield L
L = [1, 1]
yield L
while True:
M = []
n = len(L)
x = 0
while x < n -1:
M.append(L[x] + L[x+1])
x += 1
L = [1] + M[:] + [1]
yield L
测试部分代码:
n = 0
results = []
for t in triangles():
print(t)
results.append(t)
n += 1
if n == 10:
break
print('============================================')
print(results)
if results == [
[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]
]:
print('测试通过!')
else:
print('测试失败!')
执行结果:
[root@syztoo ~]# ./yang_hui_triangle.py
[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]
============================================
[[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]]
测试通过!
2、别人写的
生成器部分代码:
def triangles():
p = [1]
while True:
yield p
p = [1]+[p[x]+p[x+1] for x in range(len(p)-1)]+[1]
太精致!!!