python进阶4——yield,迭代器和生成器

yield和next函数

首先看以下代码,根据以往的知识,tmp=flatten(items),这两者是相当的,所以print的结果不会改变,但事实并非如此。

from collections import Iterable

def flatten(items, ignore_types=(str, bytes)):
    for x in items:
        if isinstance(x, Iterable) and not isinstance(x, ignore_types):
            yield from flatten(x)
        else:
            yield x


items=[[1,2,3],[4,5,6],[7,8,9]]

tmp=flatten(items)
print(next(flatten(items)))
print(next(flatten(items)))
print(next(flatten(items)))

tmp=flatten(items)
print(next(tmp))
print(next(tmp))
print(next(tmp))

在这里插入图片描述
这是为什么?关键就在于yield和next函数。
一次yield相当于return,但yield不会彻底终结这个函数,而是保留阻塞当前函数的状态,等待下一次next函数调用后再启动。

def logh(n):
    now = 0
    while now < n:
        yield now
        now += 1


print(list(logh(10)))

在这里插入图片描述
这就是简单使用yield生成器产生序列结果,更常见的有:

[x*x for x in range(10)]

生成0到9的平方数

这里用type也可以查看类型:两者的显示都是generator(生成器)类型

print(type(x*x for x in range(10)))
print(type(logh(10)))

在这里插入图片描述
在难以理解时甚至可以粗暴认为generator就是代表着列表中的元素,虽然投机取巧,但这样往往是捷径。

generator.send()

generator.send()函数是生成器的一个方法,它允许我们在生成器函数中向生成器发送数据。当我们调用generator.send(value)时,生成器会从上一次的yield语句处继续执行,并将value赋值给上一次yield的返回值。如果生成器已经到达了结尾,那么调用 generator.send() 将会抛出一个 StopIteration 异常。它的返回值就是该生成器调用一次next()的返回值。

def jumping_range(N):
    index = 0
    while index < N:
        # 通过send()发送的信息将赋值给jump
        jump = yield index#这就相当于return 和 receive结合,return当前值,也接受外部输入
        if jump is None:
            jump = 1
        index += jump

if __name__ == '__main__':
    itr = jumping_range(5)
    print(next(itr))
    print(itr.send(2))
    print(next(itr))
    print(itr.send(-1))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值