python生成器-yield的使用 使用yield实现多任务

⽣成器

利⽤迭代器,我们可以在每次迭代获取数据(通过next()⽅法)时按照特定的规律进⾏⽣成。但是我们在实现⼀个迭代器时,关于当前迭代到的状态需要我们⾃⼰记录,进⽽才能根据当前状态⽣成下⼀个数据。为了达到记录当前状态,并配合next()函数进⾏迭代使⽤,我们可以采⽤更简便的语法,即⽣成器(generator)。⽣成器是⼀类特殊的迭代器。

yield

  • 使⽤了yield关键字的函数不再是函数,⽽是⽣成器。(使⽤了yield的函数就是⽣成器)
  • yield关键字有两点作⽤:
    1.保存当前运⾏状态(断点),然后暂停执⾏,即将⽣成器(函数)挂起
    2.将yield关键字后⾯表达式的值作为返回值返回,此时可以理解为起到了return的作⽤
  • 可以使⽤next()函数让⽣成器从断点处继续执⾏,即唤醒⽣成器(函数)
  • Python3中的⽣成器可以使⽤return返回最终运⾏的返回值,⽽Python2中的⽣成器不允许使⽤return返回⼀个返回值(即可以使⽤return从⽣成器中退出,但return后不能有任何表达式)。

产生生成器方法

推导式[]换成()

在这里插入图片描述

使用yield next执行程序,于yield处暂停,下次调用next继续执行。

生成器模板:
1.next启动方式:
在这里插入图片描述
注:

  • 生成器通过next执行
  • ret.value于异常捕捉处得到上方return的值

2.send方法启动:
同next方法,但能传参数,得到yield前的传的参数的值ret值及同next的值(得到两个值)
在这里插入图片描述
给新的一个参考值,通过send传进去,并同执行一次next,结果得到send值及next值
注意: send不能在第一次执行,或第一次用send(None)

使用yield实现多任务

多任务实际为并发,同一时刻仅有一个在做

import time


def task_1():
    while True:
        print("---1----")
        time.sleep(0.1)
        yield


def task_2():
    while True:
        print("---2----")
        time.sleep(0.1)
        yield


def main():
    t1 = task_1()
    t2 = task_2()
    # 先让t1运行一会,当t1中遇到yield的时候,再返回到24行,然后
    # 执行t2,当它遇到yield的时候,再次切换到t1中
    # 这样t1/t2/t1/t2的交替运行,最终实现了多任务....协程
    while True:
        next(t1)
        next(t2)


if __name__ == "__main__":
    main()

猜你喜欢

转载自blog.csdn.net/weixin_44850984/article/details/89353064
今日推荐