生成器 generator

本文介绍了Python中的生成器,它能有效解决内存限制问题,通过保留函数状态来避免创建完整列表。文章展示了如何通过列表生成式和函数创建生成器,并通过next()函数和for循环遍历生成器。此外,还给出了两个示例,一个生成斐波那契数列,另一个使用send()方法与生成器交互。
摘要由CSDN通过智能技术生成

生成器:

通过列表⽣成式,我们可以直接创建⼀个列表。但是,受到内存限制,列表容量肯定是有限的。⽽且,创建⼀个包 含100万个元素的列表,不仅占⽤很⼤的存储空间,如果我们仅仅需要访问前⾯⼏个元素,那后⾯绝⼤多数元素占 ⽤的空间都⽩⽩浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推 算出后续的元素呢?这样就不必创建完整的list,从⽽节省⼤量的空间。在Python中,这种⼀边循环⼀边计算的机 制,称为⽣成器:generator。

1. 节约内存

2. 迭代到下⼀次的调⽤时,所使⽤的参数都是第⼀次所保留下的,在整个所有函数调⽤的参数都是第⼀次所调⽤时保 留的,⽽不是新创建的

#列表生成式   列表生成的表达式

#list1=[0,1,2,3,4,5]  没有用生成器 创建一个列表

list1=[x for x in range(1,10)]     #列表生成式
print(list1)
#无法解决内存受限的问题


#生成器:  里边式一个对象 保存了产生元素的算法,同时会记录游标的位置 (游标)输出到第几个数值
#创建一个生成器:(两种方法)
#1.通过列表生成式创建
#2.通过函数来创建一个生成器 (yield)
#遍历生成器中的元素内容(4种方法)
#1.通过next(g)  可能会抛异常  stopiteration 当生成器中已经没有数值 而程序还在继续输出时会抛出异常
#2.通过for 循环来遍历
#3.object内置的__next__  可能会抛异常  stopiteration 当生成器中已经没有数值 而程序还在继续输出时会抛出异常
#4.send 函数遍历生成器对象  生成器的第一个值必须使用send(None),后面的就没有限制了
g=(x for x in range(1,10))
#print(next(g))
#print(next(g))
#print(next(g))
#print(next(g))
#print(next(g))

#for i in g:
#    print(i)

g2=(x for x in range(10) if x%2==0)
print(next(g2))
print(next(g2))
print(next(g2))
print(next(g2))
print(next(g2))
print(next(g2))
print(next(g2))

--------------------------------------------------------------------------------------------------------------------------------

def test1(times):
    #初始化
    a,b=0,1
    n=0
    while n<times: #tield 一般用于创建一个生成器  返回后面的变量值给生成器
        yield b #print(b) #B就式斐波拉且数列中的一元素
        a,b=b,(a+b)
        n+=1
    return "done"



#print(test1(6))  #前6个斐波拉且数
g=test1(6)
print(g)

print(next(g))


def test2():
    #初始化
    a,b=0,1
    while True: #tield 一般用于创建一个生成器  返回后面的变量值给生成器
        temp=yield b #print(b) #B就式斐波拉且数列中的一元素
        a,b=b,(a+b)
        print(temp)#输出None
    return "done"

g1=test2()
print(g1)
#print(next(g1))

#print(g1.__next__())   #__next__第3中遍历生成器的方法

print(g1.send(None))
print(g1.send(''))
print(g1.send(''))
print(g1.send(''))
print(g1.send(''))
print(g1.send(''))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值