首页 > 编程语言 >python 协程

python 协程

时间:2023-02-24 22:23:11浏览次数:40  
标签:search 协程 coroutine python 生成器 send yield

协程

Python中的协程和生成器很相似但又稍有不同。主要区别在于: 生成器是数据的生产者 协程则是数据的消费者

首先我们先来回顾下生成器的创建过程。我们可以这样去创建一个生成器:

    def fib():
        a, b = 0, 1
        while True:
            yield a
            a, b = b, a+b

 

然后我们经常在for循环中这样使用它:

    for i in fib():
        print i

 

这样做不仅快而且不会给内存带来压力,因为我们所需要的值都是动态生成的而不是将他们存储在一个列表中。更概括的说如果现在我们在上面的例子中使用yield便可获得了一个协程。协程会消费掉发送给它的值。Python实现的grep就是个很好的例子:

    def grep(pattern):
        print("Searching for", pattern)
        while True:
            line = (yield)
            if pattern in line:
                print(line) 

 

等等!yield返回了什么?啊哈,我们已经把它变成了一个协程。它将不再包含任何初始值,相反要从外部传值给它。我们可以通过send()方法向它传值。这有个例子:

    search = grep('coroutine')
    next(search)
    #output: Searching for coroutine
    search.send("I love you")
    search.send("Don't you love me?")
    search.send("I love coroutine instead!")
    #output: I love coroutine instead!

 

发送的值会被yield接收。我们为什么要运行next()方法呢?这样做正是为了启动一个协程。就像协程中包含的生成器并不是立刻执行,而是通过next()方法来响应send()方法。因此,你必须通过next()方法来执行yield表达式。

我们可以通过调用close()方法来关闭一个协程。像这样:

    search = grep('coroutine')
    search.close()

 

标签:search,协程,coroutine,python,生成器,send,yield
From: https://www.cnblogs.com/zuochuang/p/17153378.html

相关文章

  • python -m 和python -u
    python-m现有路径/home/ymliu/data/csyngec/supar/cmds/crf_con.py我们在目录csyngec下,运行python-msupar.cmds.crf_con与运行pythonsupar/cmds/crf_con.py一样......
  • python open函数
    open函数open 函数可以打开一个文件。超级简单吧?大多数时候,我们看到它这样被使用:f=open('photo.jpg','r+')jpgdata=f.read()f.close()我现在写这篇文章的原因,......
  • python学习——【第十三弹】
    前言上一篇文章​​python学习——【第十二弹】​​中学习了python中的深拷贝和浅拷贝,这篇文章接着学习python中的模块。什么是模块在python中,一个文件(以“.py”为后缀名的......
  • python For - Else
    循环是任何语言的一个必备要素。同样地,for循环就是Python的一个重要组成部分。然而还有一些东西是初学者并不知道的。我们将一个个讨论一下。我们先从已经知道的开始。......
  • python lambda表达式
    lambda表达式是一行函数。它们在其他语言中也被称为匿名函数。如果你不想在程序中对一个函数使用两次,你也许会想用lambda表达式,它们和普通的函数完全一样。Lambda表达式......
  • IDApython
    IDApython里面常用的函数指令importidc#对ea所在地址进行反汇编,得到汇编指令字符串idc.GetDisasm(ea)#获取上一条指令地址,返回int类型idc.prev_head(ea)#获取下......
  • python正则表达式替换所有内容并同时保留找到的内容
    除了一些专业的工具,例如ue,大部分变成语言的函数包都挺让人迷惑的。因为的确有许多功能是很常用的,但是他们又不提供,非得要程序员自己去实现,或者是利用三方的包.例如我们会......
  • Mac 创建Python3虚拟环境
    Mac创建Python3虚拟环境1、安装virtualenvpip3installvirtualenv安装virtualenvwrapperpip3installvirtualenvwrapper创建所以.virtualenvs的隐藏文件夹存......
  • #Python基础 DateFrame 查看数据信息
    一:导入案例数据及X-MIND 二:实例 2.1显示摘要信息  2.2显示描述性统计信息   2.3显示前后n行  2.4显示索引、列信息  2.5显示每列的数据类......
  • python Gui编程工具详解:beeware
    各个gui开发工具对比Flexx:可以使用Flexx创建桌面应用程序和web应用程序,同时可以将程序导出到独立的HTML文档中,GitHub推荐Kivy&BeeWare:只需编写一套代码便可轻松运行于......