Python学习笔记# 生成器
前言
如果列表元素可以通过某种算法推算出来,那就不必创建完整的list可以节省大量存储空间。可以一边循环一边计算的机制成为生成器。提示:以下是本篇文章正文内容,本人是初学者,下面案例参考网络。
一、创建方法
创建generator的方法:
- 将列表生成器的 [] 改写成 ()
- 改写函数
方法一
g=(x*x for x in range(10))
print(g)
#next(g)
for i in g:
print(i)
方法二
def fiba(max): ##原函数
n,a,b=1,0,1
while n<=max:
print(b)
m=a
a=b
b=b+m
n=n+1
return 'done'
fiba(6)
def fib(max):###改写的生成器。将print(b)改为yield b,即可
n,a,b=1,0,1
while n<=max:
yield b
m=a
a=b
b=b+m
n=n+1
return 'done'
f=fib(10)
for i in f:###generator和函数的执行流程不一样,每次调用的时候遇到 yield语句返回
print(i)
二、生成器的使用
创建generator的方法:
- 将列表生成器的 [] 改写成 ()
- 改写函数
三、练习:杨辉三角
杨辉三角定义如下:
1
/ \
1 1
/ \ / \
1 2 1
/ \ / \ / \
1 3 3 1
把每一行看做一个list,试写一个generator,不断输出下一行的list:
方法一
def triangles():
l=[1] #初始化杨辉三角
i=1 #i作为行数
while True:
yield l
m=l[:] ##临时内存
l=[1] ##首元素
for x in range(1,i):
l.append(m[x-1]+m[x]) ###列表通过append方式更新
l.append(1) ##尾元素
i=i+1
return 'done'
###############以下是测试代码#################
n = 0
results = []
for t in triangles():
print(t)
results.append(t)
n = n + 1
if n == 10:
break
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('测试失败!')
测试结果:
方法二利用zip()和sum()两个方法实现
##利用zip()和sum()这两个方法
def triangles():
l=[1] ###初始化第一行
while True:
yield l
l=[sum(t) for t in zip([0]+l,l+[0])] ###zip将对象中对应的元素打包成元组,sum对每个元组求和
return 'done'
###############以下是测试代码#################
n = 0
results = []
for t in triangles():
print(t)
results.append(t)
n = n + 1
if n == 10:
break
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('测试失败!')
测试结果: