对生成器的简单理解

#列表生成式

# 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")


posted @ 2019-05-29 01:50  我也不想这么菜  阅读(200)  评论(0编辑  收藏  举报