python中yield的使用

本文通过一个斐波那契数列的例子介绍了Python中yield关键字的作用及其与return的区别。使用yield可以生成一系列中间计算结果,适用于需要迭代大量数据的情况。

前言

之前对yield感觉一直没有理解得很好,今天找到了一个挺好的例子,感觉可以帮助理解,就放在这里。

例子及解释

yield说明

yield 的使用方法和 return 类似。不同的是,return 可以返回有效的 Python 对象,而 yield 返回的是一个生成器,函数碰到 return 就直接返回了

例子代码

def fib(n):
    a = 1
    b = 1
    current = 1
    while current < n:
        yield a
        a,b = b,a+b
        current = current + 1

fib = fib(10)

for i in fib:
    print(i)

print('--------------------')

def fib(n):
    a = 1
    b = 1
    current = 1
    while current < n:
        a,b = b,a+b
        current = current + 1
    return a

print(fib(9))

我们可以看一下最后运行出来的结果,可以看到如果使用yield来进行返回,最后可以得到中间计算的每个数值。

python_yield用法

文艺数学君

最近在文艺数学君上在更新关于应用回归的相关知识点,如最新更新到多元线性回归部分,所以内容的实现会使用spss和mathematica,最新的链接如下:
应用回归分析之多元线性回归(SPSS版本)

Python 中,`yield` 是一个非常重要的关键字,主要用于定义生成器函数。下面从多个方面介绍其使用方法: ### yield 介绍 在 Python 中,使用 `yield` 的函数被称为生成器函数(generator function)。包含 `yield` 的函数成为一个生成器,生成器同时也是一个迭代器,支持通过 `next` 方法获取下一个值。与 `return` 不同,`yield` 每次返回结果之后函数并没有退出,而是每次遇到 `yield` 关键字后返回相应结果,并保留函数当前的运行状态,等待下一次的调用。有 `yield` 的函数则返回一个可迭代的生成器 `generator` 对象,可以使用 `for` 循环或者调用 `next()` 方法、`send()` 方法遍历这个产生的实例化生成器对象来提取结果 [^2][^4]。 ### yield 基本用法 以下是一个简单的使用 `yield` 生成一个列表的示例: ```python def gen_list(): for i in range(10): yield i for item in gen_list(): print(item) ``` 在这个例子中,`gen_list` 函数是一个生成器函数,它使用 `yield` 关键字逐个返回 `0` 到 `9` 的整数。当使用 `for` 循环遍历 `gen_list()` 时,每次循环都会触发生成器函数的执行,直到遇到 `yield` 语句,返回一个值,然后暂停函数的执行,等待下一次迭代。 ### yield 高级用法 #### yield send() 方法 `send()` 方法可以向生成器函数发送一个值,并恢复生成器的执行。以下是一个示例: ```python def generator(): value = yield print(f"接收到的值: {value}") yield value + 1 gen = generator() next(gen) # 启动生成器,使其暂停在第一个 yield 处 result = gen.send(10) print(f"生成器返回的值: {result}") ``` 在这个例子中,首先使用 `next(gen)` 启动生成器,使其暂停在 `yield` 语句处。然后使用 `gen.send(10)` 向生成器发送一个值 `10`,生成器恢复执行,将接收到的值打印出来,并返回 `value + 1`。 #### yield from 方法 `yield from` 用于简化生成器的嵌套。以下是一个示例: ```python def sub_generator(): for i in range(3): yield i def main_generator(): yield from sub_generator() for item in main_generator(): print(item) ``` 在这个例子中,`main_generator` 函数使用 `yield from` 委托 `sub_generator` 生成值。这样可以避免手动编写嵌套的循环来处理子生成器。 #### yieldyield from 叠加处理复杂情况 在更复杂的场景中,可以结合使用 `yield` 和 `yield from` 来处理多层嵌套的生成器。例如: ```python def sub_sub_generator(): yield 'a' yield 'b' def sub_generator(): yield from sub_sub_generator() yield 'c' def main_generator(): yield from sub_generator() yield 'd' for item in main_generator(): print(item) ``` 在这个例子中,`main_generator` 委托 `sub_generator` 生成值,`sub_generator` 又委托 `sub_sub_generator` 生成值,最终实现了多层嵌套的生成器。 ### yield 主要应用场景 如果一个函数需要多次循环执行一个动作,并且每次执行的结果都是需要的,这种场景很适合使用 `yield` 实现。例如,处理大量数据时,使用生成器可以节省内存,因为它不需要一次性将所有数据加载到内存中 [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值