#列表生成式 # def f(n): # return n**3 # # x = [f(a) for a in range(10)] #首先调用f函数, # print(x) def bar(): print("ok1") yield 1 print("ok2") yield 2 s = bar() #生成器还是一个可以记录状态的对象 当执行到哪里他会记住当前的执行状态,然后下次执行的时候,从上一次结束的地方开始执行 print(s) print(next(s)) print(next(s)) s = (x**3 for x in range(100000000))#此时就定义了一个生成器 print(s) #at 0x000000000BAF43B8> print(next(s))#0 print(next(s))#1 for x in s: #生成器本身就是一个可迭代对象 生成器为什么省内存 因为python本身有一个垃圾回收机制,当一个变量不在被引用的时候,这个变量就会被python清除 print(x) #0 0 1 1 2 3 5 8 def fib(max): n , before,after = 0, 0, 1, while n < max: yield before before, after = after, before+after n = n+1 g=fib(3) print(g) print(next(g))
#send方法 def loger(): count = yield "qwer" print(count) count = yield "qwer" print (count) g = loger() #将生成器赋值给一个变量啊 a = next(g) #调用这个生成器,然后返回一个变量 然后让a 去接受这个变量 print(a) # g.send(None) # = next(g) b = g.send("abc") #要使用send这个方法,首先要为这个生成器传递一个空的参数(None),因为不传递参数的话,send就不知道传递参数给谁接受不send 可以为生成器loger传递一个参数,但是首先要先执行一下这个生成器 print(b) g.send("efg") #yield实现伪并发
import timedef 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")