python中yield的工作原理及迭代方法例解

本文探讨了Python中的yield关键字,它在函数中起到暂停并记住状态的作用。yield相当于`return`加上执行位置,使得函数变成生成器。生成器在调用时不会立即执行,而是返回一个内存地址,需要通过`next()`获取yield的返回值。当没有更多的yield时,会抛出错误。此外,文章还介绍了如何通过for...in、while循环以及列表来实现基于yield的迭代。

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

yield是一个简单好用但又费解的语句。认真地琢磨了两天,觉得自己弄明白了。就结合着例子用自己的理解来说说吧。

1.yield相当于“return”+位置信息。yield这个词本身用的就很巧妙。因为这个词“生产”和“停止”两个意思都有。yield既表示产生返回值,又表示在这个地方停下来,等待下一次循环。就是从yield返回之后开始迭代。关于这一点,必须搞清楚。第一相当于return,第二下次执行该函数时不是从头再来,而是从停下的地方开始。这相当于给函数加了一个“书签”。yield是延时产生结果。

def iter1():
    print("begining iter1...")
    yield 1000
    print("go on! iter1.")

s1=iter1()

print(next(s1))

输出为:

这里要注意两点。一是包含yield的函数就成了特殊的生成器函数。调用这个生成器函数时,函数并不执行,只是构成生成器。调用生成器函数只是返回函数的内存地址。二是要用next()获得yield返回值。每一个next()只返回一个返回值。如果没有yield了,则报错。

例如,如果为上例再增加一行代码:

print(next(s1))

系统则会报错。因为iter1()函数里,yield只有一次机会,没有第二个循环。事实上没有形成迭代。当然,这里的yield意义不大。

2.利用for...in迭代。利用yield形成迭代的方法。yield可以记录位置,但本身不形成迭代。需要通过for...in语句或者while语句,或者列表来完成跌到。

def iter2():
    print("begining iter2...")
    for i in range(5):
        yield i*2
    print("go on! iter2")

s2=iter2()
for i in range(5):
    print(next(s2))

3.利用while迭代。

def iter3(count):
    print("begining iter3:")
    while count<10:
        yield count*2
    print("go on! iter3")

s3=iter3(5)
for i in range(5):
    print(next(s3))

4.利用列表迭代

def addlist(alist):
    for i in alist:
        yield i+1

alist=[1,2,3,4,5]
for x in addlist(alist):
    print(x)

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值