在跟着廖雪峰的博客学习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() 输出结果 <generator object <genexpr> at 0x7f543a074690> 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 n print 'increment n' n += 1 cnt = create_counter(2) #print cnt for item in cnt: print item #print next(cnt) #print next(cnt) #print cnt.next() #print cnt.next() 比如这个例子中,当打印cnt的时候,<generator object create_counter at 0x7fa992b8d6e0> 说明这是一个,生成器。 当为True的时候,用for 循环就会出现死循环的情况。 协程: 我知道有进程、线程的概念,但是协程是什么东西,我还真是不知道 从技术的角度来说,“协程就是你可以暂停执行的函数”。如果你把它理解成“就像生成器一样”,那么你就想对了。这是在一篇文章上看到的。 python之所以执行效率高 1、为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。 2、执行的过程中不会涉及到锁机制。 附一个简单的生产者和消费者的例子: def consumer(): r = '' while True: n = yield r if not n: return print('[CONSUMER] Consuming %s...' % n) time.sleep(1) r = '200 OK' def produce(c): c.next() n = 0 while n < 5: n = n + 1 print('[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。 总结来说,就是 yield r 是一个表达式,通过 c.send 被赋值,然后返回值为下一个为yield r 表达式的参数。
github路径:https://github.com/billzhangjingle/learnPython/basic/generator.py 在学习的时候搜索到的相关博客: http://python./86069/ http://python./86481/ http://www.cnblogs.com/gide/p/6187080.html http://www./wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868328689835ecd883d910145dfa8227b539725e5ed000 http://www.cnblogs.com/cotyb/p/5260032.html |
|
来自: wenxuefeng360 > 《待分类1》