yield和return的区别

本文通过对比`yield`和`return`在Python函数中的使用,探讨了生成器的工作原理。当函数遇到`yield`时,会返回一个生成器对象并暂停执行,而`return`则直接返回结果并结束函数。在调用生成器对象的`next()`方法时,函数会从上次暂停的位置继续执行,直至遇到下一个`yield`或函数结束。这种特性使得生成器在处理大量数据时能有效节省内存。

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

结论

yield是暂停当前函数的执行,并返回一个生成器。
return直接返回当前函数的运行结果

样例

return的样例

return使用的还是比较多的,当一个函数执行到return的时候,程序会在当前位置直接返回一个结果。


def get_num_yield():
    for i in range(10):
        yield i
        num = i
        print(i)


def get_num_return():
    for i in range(10):
        return i
        num = i
        print(i)


if __name__ == '__main__':
    b_return = get_num_return()
    print(b_return)
    b_yield = get_num_yield()
    print(b_yield)

这个例子里面有两个方法,大家先看第一个方法即可,

yield的样例

同上,这次看yield 的样例就好了

论证

还是这个代码:


def get_num_yield():
    for i in range(10):
        yield i
        num = i
        print(i)


def get_num_return():
    for i in range(10):
        return i
        num = i
        print(i)


if __name__ == '__main__':
    b_return = get_num_return()
    print(b_return)
    b_yield = get_num_yield()
    print(b_yield)

数据结果如下:
在这里插入图片描述

这样貌似看不出来什么,带我给它变个样子。


def get_num_yield():
    for i in range(10):
        yield i
        num = i
        print('get_num_yield方法中数据的b_yield--',i)


def get_num_return():
    for i in range(10):
        return i
        num = i
        print('get_num_return方法中数据的b_yield--',i)


if __name__ == '__main__':
    b_return = get_num_return()
    print('main方法中数据的b_return--',b_return)
    b_yield = get_num_yield()
    print('main方法中数据的b_yield--',b_yield)

输出结果如下:

在这里插入图片描述
目前为止哈,我们可以看到,两个只有返回值的不同,一个是返回了一个值,另一个返回的是一个生成器对象,这生成器对象是干啥的呢?当我们将使用next调用这个生成器对象的时候,会发生一个很神奇的事:

def get_num_yield():
    for i in range(10):
        yield i
        num = i
        print('get_num_yield方法中数据的b_yield--', num)


def get_num_return():
    for i in range(10):
        return i
        num = i
        print('get_num_return方法中数据的b_yield--', i)


if __name__ == '__main__':
    b_return = get_num_return()
    print('main方法中数据的b_return--', b_return)
    b_yield = get_num_yield()
    print('main方法中数据的b_yield--', b_yield)
    print('main方法中数据的b_yield调用next--', next(b_yield))
    print('main方法中数据的b_yield调用next--', next(b_yield))

运行结果如下:
在这里插入图片描述
这样就很明显了,当程序遇到yield时,会将一个生成器(generator)对象返回给调用它的函数,但是并不是结果,而是暂停在了这里,当我们调用next这个生成器对象时,会继续运行之前的函数,也就是将我们的之前的0返回给了next调用的地方,当我们想继续往下走的时候,需要再次使用next调用,此时执行get_num_yield的赋值语句并且for循环继续执行,此时又碰到了yield,所有又暂停了,以此往复,直到报错信息stop iteration出现为止。
在运行到yield处时,函数暂停运行,使用下一个next后再次开始正常运行,直到遇到下一个yield

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值