python生成器generator介绍

  在跟着廖雪峰的博客学习python,看到生成器这一章节的时候,首先提到了generator 、yield,然后在搜索资料的时候,又查到了协程这一概念,这篇文章总结一下这几个概念.

  generator  从字面上理解,就是生成器,它的实现方式有两种:

1、不同于列表生成器([]),而是用 ()来表示。(原来这种叫做生成器表达式哦,哈哈)

   访问方式,可以用for 循环来访问,也可以用 .next 来访问。

N = ['Hello', 'World', 18, 'Apple', 'None']hh = (s.lower() for s in N if isinstance(s,str) ==True)print hh#for item in hh:#    print item#print hh.next()#print hh.next()#print hh.next()#print hh.next()

登录后复制

输出结果

立即学习“Python免费学习笔记(深入)”;

at 0x7f543a074690>
hello
world
apple
none

hh 是生成器返回的值,类似于一个数组。支持 for循环访问和 .next()访问,有一点需要注意的是,for 循环执行完了之后就不能执行 hh.next()了,类似于指针到了最后,或者C++中迭代器指向了最后,再访问就会出现错误。

2、用yield来生成 ,(叫做生成器函数)

无论用next() 和for 循环来调用,都是执行到了yield之后,返回 n值,然后将当前的状态挂起,然后返回。

def create_counter(n):print "create counter"#while True:while False:yield nprint 'increment n'n += 1cnt = create_counter(2)#print cntfor item in cnt:print item#print next(cnt)#print next(cnt)#print cnt.next()#print cnt.next()

登录后复制

比如这个例子中,当打印cnt的时候,

说明这是一个,生成器。
当 为False的时候,只会打印 create counter

当为True的时候,用for 循环就会出现死循环的情况。

协程:

我知道有进程、线程的概念,但是协程是什么东西,我还真是不知道

从技术的角度来说,“协程就是你可以暂停执行的函数”。如果你把它理解成“就像生成器一样”,那么你就想对了。这是在一篇文章上看到的。

python之所以执行效率高

1、为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。

2、执行的过程中不会涉及到锁机制。

 附一个简单的生产者和消费者的例子:

def consumer():    r = ''while True:        n = yield rif not n:returnprint('[CONSUMER] Consuming %s...' % n)        time.sleep(1)        r = '200 OK'def produce(c):    c.next()    n = 0while n < 5:        n = n + 1print('[PRODUCER] Producing %s...' % n)        r = c.send(n)print('[PRODUCER] Consumer return: %s' % r)    c.close()if __name__=='__main__':    c = consumer()    produce(c)

登录后复制

1. consumer函数是一个generator。 
2. c.send(None)其实等价于next(c),第一次执行时其实只执行到n = yield r就停止了,然后把r的值返回给调用者。 
3. yield r是一个表达式,通过send(msg)被赋值,而send(msg)是有返回值的,返回值为:下一个yield r表达式的参数,即为r。 
4. produce一旦生产了东西,通过c.send(n)切换到consumer执行。consumer通过yield拿到消息,处理,又通过yield把结果传回。也就是说,c.send(1) 不但会给 c 传送一个数据,它还会等着下次 yield 从 c 中返回一个数据,它是有返回值的,一去一回才算完,拿到了返回的数据(200 OK)才继续下面执行。 
5. 整个流程无锁,由一个线程执行,produce和consumer协作完成任务,所以称为“协程”,而非线程的抢占式多任务。

总结来说,就是 yield r 是一个表达式,通过 c.send 被赋值,然后返回值为下一个为yield r 表达式的参数。

 

以上就是python生成器generator介绍的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2268058.html

(0)
上一篇 2025年2月27日 10:30:17
下一篇 2025年2月19日 06:13:12

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • python基础之输入输出和运算符

    今天总结一下最基础的输入输出和运算符 输入: python3里都是input(””) input() name = input()    #输入的值会直接赋值给name 立即学习“Python免费学习笔记(深入)”;…

    2025年2月27日 编程技术
    200
  • 目前比较常用的计算机语言

    目前使用最广泛的计算机语言包括:Python:通用、解释性语言,用于数据科学和自动化。Java:面向对象语言,用于企业应用程序和安卓开发。C++:通用、低级语言,用于操作系统和游戏开发。C#:面向对象语言,用于 Windows 应用程序开发…

    2025年2月27日
    200
  • 现在常用的计算机语言有哪几种

    当前常用的计算机语言有Python、Java、JavaScript、C++、C#、SQL和R。这些语言各有特色,适用于不同的应用场景,开发人员可根据需求选择适当的语言。 当下常用的计算机语言 随着计算机技术的飞速发展,计算机语言的数量不断增…

    2025年2月27日
    200
  • 计算机中的高级语言有哪些

    计算机高级语言,面向人类设计,使用易懂语法,无需了解底层硬件。常见的高级语言包括:1. Python:数据科学、机器学习、Web 开发;2. Java:可靠、安全,用于各种应用程序;3. C#:Windows 应用程序开发;4. C++:兼…

    2025年2月27日
    200
  • 现在最常用的计算机编程语言

    Python是目前最常用的编程语言。原因包括其易于学习、多功能性、丰富的库生态系统、跨平台兼容性和强大高效性。它广泛用于web开发、数据分析、机器学习、科学计算和自动化等领域。 现在最常用的计算机编程语言 答案:Python 详细内容: P…

    2025年2月27日
    200
  • 常用计算机高级编程语言有哪些

    常用的高级编程语言旨在简化编程并增强可读性,包括:Python、Java、C++、C#、JavaScript、R、Swift 和 Go。这些语言分别擅长于网络开发、企业级应用、高性能系统、Windows 应用、Web 开发、统计计算、iOS…

    2025年2月27日
    200
  • python的变量和常量的实例详解

    今天看看python的变量和常量: 首先先说一下解释器执行Python的过程:    python3 C:est.py  1. 启动python解释器(内存中) 2. 将C:est.py内容从硬盘读入内存(这一步与文本编辑器是一样的) 3.…

    2025年2月27日
    200
  • 有几种常用的计算机编程语言

    常用的计算机编程语言包括 Python、Java、C++、JavaScript、PHP、Bash、HTML、CSS、XML、R、MATLAB 和 SQL。选择编程语言时,应考虑应用类型、性能要求、开发团队经验以及可维护性和可读性。 有哪些常…

    2025年2月27日
    200
  • 计算机高级语言有哪些系列

    计算机高级语言分为五个系列:过程式编程(如 Fortran、C):关注任务执行顺序。面向对象编程(如 C++、Java):基于对象,强调数据封装和信息隐藏。函数式编程(如 Lisp、Haskell):基于数学函数,无副作用和不可变。逻辑编程…

    2025年2月27日
    200
  • Python基础汇总

    测试代码   编写函数和类时,还可以编写测试函数,通过测试可以确定代码面对各种输入都能正常工作。在程序中添加新代码时,也可以对其进行测试,确定他们不会破坏程序的既有程序。要经常测试模块。   通过python的模块unittest中的工具来…

    编程技术 2025年2月27日
    200

发表回复

登录后才能评论