前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一文读懂python yield

一文读懂python yield

作者头像
你算哪块香橙夹心饼干
修改2021-11-01 15:07:35
4190
修改2021-11-01 15:07:35
举报
文章被收录于专栏:用户1976747的专栏

yield作为python内置关键字,译为生产。在函数中可暂时认为 return 的替代品。

如果某函数包含 yield,直接调用此函数时,函数并不直接执行函数逻辑,而是返回一个generator。 通过调用 generator.next() 或 item (for循环) 触发函数执行,执行到yield时,可视为返回yield后的值。

其好处在于在需要结果时才执行获取,不必提前申请过多内存信息来存取处理结果列表。

(日常开发不太用,源码中比较常见,调用接口时需要捋清使用方法)

yield代码简单示例(斐波那契)

代码语言:javascript
复制
def fab(max):
    n, a, b = 0, 0, 1
    while n < max:
        print b
        a, b = b, a + b
        n = n + 1

fab(6)

输出: 
1
1
2
3
代码语言:javascript
复制
然后我们将使用 yeild 声明 b, 相当于每次调用fab时,返回b。 代码如下
代码语言:javascript
复制
def fab_yield(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1

# 函数返回生成器,并不会触发逻辑执行
generator = fab_yield(4)
# 为了更容易理解,调用4个.next来获取数据,日常可以直接使用for i in fab_yield
print(y.next())
print(y.next())
print(y.next())
print(y.next())
# 多余的next调用会StopIteration异常

上面提到使用 for i in fab_yield()同样可以取出数据,那顺带一下python中for循环的原理

python for 原理

python中可迭代的对象很多。列表、元组、字典等都可以,这些对象必须都有 __iter__ 和 next 方法。

其中__iter__返回一个Iterator(类似生成器),使用for遍历对象时相当于调用__iter__获取一个Iterator,然后调用 next 遍历数据。

for 流程验证用例:

代码语言:javascript
复制
class Te:
    def __init__(self):
        self.a = 0

    def __iter__(self):
        print("call iter")
        return self

    def next(self):
        print("call next")
        if self.a >= 3:
            raise StopIteration()
        self.a += 1
        return self.a


t=Te()
for i in t:
    print(i)


输出:
call iter
call next
1
call next
2
call next
3
call next
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-10-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档