python——函数 19、生成器

本文详细介绍了Python中的生成器概念,包括其定义、如何使用以及与迭代器的关系。通过具体示例解释了yield关键字的作用和特点,并对比了yield与return的区别。

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

一、什么是生成器?

      答:当函数体内有yield的关键字时就叫做生成器

def foo():
    print('a')
    yield 1
    print('b')
    yield 2
    print('c')
    yield 3
x=foo()
print(x.__next__())
print(x.__next__())

可以看出 1、生成器就是迭代器

                2、yield与return一样 都是返回值 (区别?向下继续看)

既然生成器就是迭代器 那就可以用for循环来实现一下这个

def foo():
    print('a')
    yield 1
    print('b')
    yield 2
    print('c')
    yield 3
    print('d')
x=foo()
for i in x:
    pass
在迭代器里已经说过for循环原理
像这个for循环 for i in x: (#obj=x.__iter__#obj.__next__)
def foo():
    print('a')
    yield 1
    print('b')
    yield 2
    print('c')
    yield 3
    print('d')
x=foo()
for i in x:
    print(i)#将每次next返回值打出来
每一个next都会print一次 所以打印的结果如下图: 可以看到d是没有返回值的 在迭代器里 就会报出StopIteration但是for循环里他会自动捕捉所以就不会报异常

二、yield的功能

                         1、把函数的最后执行结果做成迭代器

                         2、yield与return类似,只不过是yield可以返回多个值,而return只能返回一个值

                         3、遵循迭代器取值方式 obj.__next__(),触发函数执行,当运行一次obj.__next__()时函数就会停到第一个yield,也就是说你写几个obj.__next__()你函数就停在第几个yield

例子:

def foo(x):
    print('play')
    while x>0:
        yield x
        x-=1
    print('game over')
g=foo(5)
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())

当然 这样会报一个StopIteration的异常,前面已经说过既然是迭代器也可以这么改一下代码:

def foo(x):
    print('play')
    while x>0:
        yield x
        x-=1
    print('game over')
g=foo(5)
for i in g:
    print(i)

不再写g.__next__() ,把它改为for循环 就可以自动捕捉异常 不会再报出StopIteration异常

转载于:https://www.cnblogs.com/StevenSunYiwen/p/9358683.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值