python yield的返回值

本文深入探讨Python生成器函数的原理,通过实例解析yield表达式的运作机制,包括如何使用next方法获取值,以及在赋值操作中yield的特殊行为。
部署运行你感兴趣的模型镜像

初识yield表达式是在生成器学习中,只要函数中出现yield表达式,那么这个函数就是生成器函数。当函数执行到yield那一行时,yield就会返回后面的值,然后冻结当前函数状态,下行代码不执行,等下一次调用再唤醒接着往下执行。


先来个简单生成器函数:

def my_gen():
        yield 1
        yield 2
        yield 3

用next方法获取值:

 ret = my_gen()
    print(next(ret))
    print(next(ret))
    print(next(ret))

结果是1,2,3

如果把yield表达式赋值给一个变量,打印那个变量,结果会是怎样呢?再来一个简单生成器 试试看

def my_gen(start):
        while start < 10:
            temp = yield start
            print(temp)
            start += 1

先来调用下函数,把1传给my_gen() 

ret = my_gen(1)
print(ret.__next__())

函数自上往下运行,进行while条件判断,1 < 10,下一条yield表达式,遇yield 返回后面的值,就是1。再把yield start的结果赋给变量temp,遇yield还会冻结函数状态,下行代码print语句不执行。

我们在调用一次next方法

print(ret.__next__())

此时函数苏醒,从print语句开始执行,先打印temp值,然后start进行+1操作,再进行条件判断,遇yield又抛出start值,现在start = 2,所以打印2。接下来又又冻结函数状态,停了下来。


本来我以为temp = 2,结果打印结果是None。顿时摸不着头脑yield明明返回的值是后面的start,怎么赋值给一个变量就变成None呢? 后来查资料,解释是第一次调用next方法后,yield先返回后面start的值出去,接下来已经没有其他值,只能赋None值给temp。

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think> 我们正在讨论Pythonyield的使用方法。根据引用内容,yield在生成器函数中使用,当函数执行到yield语句时,会返回一个值,并暂停函数的执行,直到下一次调用(例如使用next()或迭代)。在调用方,我们通常通过迭代生成器来获取这些值。 引用[1]提到,yield from语法(Python 3.3+)可以用于将生成器的部分控制权委托给另一个生成器,这在递归生成器中特别有用。 引用[2]提醒我们不要在同一个函数中混用return和yield返回值。如果要使用yield,那么整个函数应该是一个生成器函数,并且调用方需要通过迭代来获取值。 引用[3]和[4]解释了yield的基本行为:当函数执行到yield时,会返回后面的值,并冻结当前函数状态,下一次调用时从冻结的位置继续执行。 因此,调用yield返回值的方法是: 1. 定义一个生成器函数(函数中包含yield表达式)。 2. 调用该生成器函数,得到一个生成器对象。 3. 通过迭代生成器对象(例如使用for循环、next()函数或转换为列表等方式)来逐个获取yield产生的值。 下面我们给出一个简单的例子: ```python def simple_generator(): yield 1 yield 2 yield 3 # 调用生成器函数,返回一个生成器对象 gen = simple_generator() # 使用next()函数获取下一个值 print(next(gen)) # 输出: 1 print(next(gen)) # 输出: 2 print(next(gen)) # 输出: 3 # 也可以使用for循环迭代 for value in simple_generator(): print(value) # 依次输出1,2,3 ``` 另外,对于包含多个yield语句的函数,每次调用next()都会执行到下一个yield语句并返回值。如果生成器函数中没有更多的yield语句,就会抛出StopIteration异常。 如果需要从另一个生成器中产生值,可以使用yield from,例如: ```python def generator1(): yield 'a' yield 'b' def generator2(): yield from generator1() yield 'c' for char in generator2(): print(char) # 依次输出'a', 'b', 'c' ``` 这样,generator2将首先委托给generator1,产生generator1的所有值,然后继续产生自己的值。 注意:在生成器函数中,我们不应该混用return和yield。如果使用return,那么在生成器中return value实际上会触发StopIteration(value)异常,表示生成器结束,而返回值会包含在StopIteration异常中,可以通过异常捕获获取,但通常我们使用yield返回值,而不是return(除了空return表示结束)。在Python 3.3+中,可以在生成器函数中使用return来返回值,但是需要通过捕获StopIteration异常来获取,或者使用yield from结构来捕获(yield from会自动捕获StopIteration并获取其值)。不过,通常我们更倾向于使用yield返回值,而不是return。 总结:调用yield返回值的方法是迭代生成器对象。 </think>在Python中,调用`yield`返回值的方法是通过创建生成器函数,然后通过迭代或`next()`函数来获取值。以下是具体实现方法: ### 1. 定义生成器函数 在函数中使用`yield`代替`return`,函数即成为生成器: ```python def number_generator(n): for i in range(n): yield i # 每次调用返回一个值并暂停 ``` ### 2. 调用生成器获取值 #### 方法一:使用`next()`函数 ```python gen = number_generator(3) print(next(gen)) # 输出: 0 print(next(gen)) # 输出: 1 print(next(gen)) # 输出: 2 ``` #### 方法二:通过`for`循环迭代 ```python for num in number_generator(3): print(num) # 依次输出: 0, 1, 2 ``` #### 方法三:转换为列表 ```python nums = list(number_generator(3)) print(nums) # 输出: [0, 1, 2] ``` ### 3. `yield from`委托(Python 3.3+) 用于嵌套生成器: ```python def wrapper_generator(): yield from number_generator(2) # 委托内部生成器 yield 'end' for item in wrapper_generator(): print(item) # 输出: 0 → 1 → 'end' ``` ### 注意事项 1. 生成器函数执行到`yield`时暂停,状态被保留,下次调用时继续执行[^3] 2. 不要混用`return`和`yield`(除非`return`用于结束生成器)[^2] 3. 生成器耗尽后会抛出`StopIteration`异常 4. 生成器是惰性求值,节省内存 > 示例:带条件的生成器 ```python def conditional_generator(data): for item in data: if item % 2 == 0: yield item * 2 # 仅处理偶数 result = [x for x in conditional_generator([1,2,3,4])] print(result) # 输出: [4, 8] (2*2 和 4*2) ``` [^1]: yield from语法用于将生成器的部分控制权委托给另一个生成器 [^2]: 避免在同一个函数中混用return和yield返回值 [^3]: yield会返回后面的值并冻结当前函数状态 [^4]: 生成器函数中可以包含多个yield语句按顺序执行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值