011python路--生成器
Posted 5014sy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了011python路--生成器相关的知识,希望对你有一定的参考价值。
#列表生成式 a = [x*2 for x in range(10)] a = [x*2 for x in a] def f(n): return n+1 a = [f(x) for x in range(10)] print(a) #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
赋值 t= (‘12‘,8)#t= [‘12‘,8] a,b= t print(a)#12 print(b)#8 等价于- a=t[0] b=t[1]
列表生成器 1. s = (x*2 for x in range(5)) print(s) #<generator object <genexpr> print(next(s))# 尽量不用s.next() 生成器就是一个可迭代对象iterable for i in s: print(i) #内部有迭代器遍历。next过的元素无引用,将被回收
2. yield def foo(): print("123") yield 1 a = foo() print(a) #<generator object <genexpr> --------------------------- def foo(): print(‘ok‘) yield 1 print(‘ok2‘) yield 2 for i in foo(): print(i) 结果:ok 1 ok2 2 next(foo()) next(foo()) #next首先指向print,之后返回yield 1 #不过没有变量接受,屏幕不显示
for i in +可迭代对象(列表,元组,字典,) 本质因为内部有_iter_()方法 斐波那契: 普通函数 def fid(number): n,before,after = 0,0,1 while n<number: print(before) after,before = before,after+before#算出=后面结果再赋值 n+=1 fid(5)
生成器对象--next def fid(number): n,before,after = 0,0,1 while n<number: yield before after,before = before,after+before n+=1 g = fid(8) print(next(g)) for i in fid(8): print(i)
send def bar(): print(‘ok1‘) count=yield 1 print(count) print(‘ok2‘) yield 2 g = bar()# 创建生成器对象 print(g.send(None)) print(g.send(‘eee‘)) # 结果:ok1 # 1 # eee # ok2 # 2 # send与next的区别就是,send能给yield前面变量传值 # b.send(None)==next(b)
通过生成器yield实现伪开发 通过yield实现在单线程的情况下实现并发运算的效果 import time def consumer(name): print("%s 准备吃包子啦!" %name) while True: baozi = yield print("包子[%s]来了,被[%s]吃了!" %(baozi,name)) def producer(name): c = consumer(‘A‘) c2 = consumer(‘B‘) c.__next__() c2.__next__() print("老子开始准备做包子啦!") for i in range(10): time.sleep(1) print("做了2个包子!") c.send(i) c2.send(i) producer("alex")
以上是关于011python路--生成器的主要内容,如果未能解决你的问题,请参考以下文章