python 生成器

本文介绍了Python中的生成器,对比了列表生成式,强调生成器在处理大量数据时节省内存的优势。通过实例展示了如何创建生成器,并指出使用for循环可以直接遍历生成器,但无法获取return语句的返回值,需要捕获StopIteration异常来获取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先说一下列表生成式:

它还是比较常用的,生成一个简单的数组:

list_a=list(range (1,11))
>>>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

在复杂的场景下,我们不可能一个一个的append方式插入数据,可以利用列表生成式很简单的生成:

print([x*5+2 for x in list(range(1 ,10)) if x%2==1])
》》》[7, 17, 27, 37, 47]

生成器:

列表生成式需要一次性生成所有的元素,如果需要每次按照需求来生成,而不是一次性全部生成(节约内存:创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了),在Python中,这种一边循环一边计算的机制,称为生成器:generator

创建一个生成器很简单,只需要将列表生成式 的[] 改为()便OK,

L=[x*5+2 for x in list(range(1 ,10)) if x%2==1]
print(L)
#>>>[7, 17, 27, 37, 47]
generator_a = (x*5+2 for x in list(range(1 ,10)) if x%2==1)
print(generator_a)
#>>><generator object <genexpr> at 0x00000113CB8C87C8>

可以看出,L是一个list,而generator_a是一个生成器,generator保存的是算法,可以通过next()h获取数据:

generator_a = (x*5+2 for x in list(range(1 ,10)) if x%2==1)
print(next(generator_a))
>>>7
print(next(generator_a))
>>>17
print(next(generator_a))
>>>27

这种方式显然很麻烦,直接用for循环可以替代,

generator_a = (x*5+2 for x in list(range(1 ,10)) if x%2==1)
for x in generator_a:
    print(x)

但是有的需求不能直接用列表生成式写出来,但是可以用函数表达式写出来:

#普通函数表达式写法
def teshu_generat(num):
    a,b=0,10
    while num>b:
        print(num)
        if num>a:
            a+=2
            num-=a
    return 'OK'
print(teshu_generat(20))
# >>> 20
# >>> 18
# >>> 14
# >>> OK
#转换为生成器,只需要把输出转换一下写法:
def teshu_generat1(num):
    a,b=0,10
    while num>b:
        yield num
        if num>a:
            a+=2
            num-=a
    return 'OK'
end =teshu_generat1(20)
print(end)
#>>> <generator object teshu_generat1 at 0x0000016CF77D87C8>
for x in end:
    print(x)
# >>> 20
# >>> 18
# >>> 14

需要注意的是:用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中:

while True:
    try:
        x =next(end)
        print('元素是:',x)
    except StopIteration as e:
        print('Generator return value:', e.value)
        break
# >>> 20
# >>> 18
# >>> 14
# >>> Generator return value: None

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值