Python学习笔记# 生成器

Python学习笔记# 生成器


前言

如果列表元素可以通过某种算法推算出来,那就不必创建完整的list可以节省大量存储空间。可以一边循环一边计算的机制成为生成器。

提示:以下是本篇文章正文内容,本人是初学者,下面案例参考网络。

一、创建方法

创建generator的方法:

  1. 将列表生成器的 [] 改写成 ()
  2. 改写函数

方法一

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. 将列表生成器的 [] 改写成 ()
  2. 改写函数

三、练习:杨辉三角

杨辉三角定义如下:

      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('测试失败!')

测试结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值