#列表生成式
# 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) #<generator object <genexpr> 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 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")