对生成器的简单理解

#列表生成式

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


转载于:https://www.cnblogs.com/langjitanya/p/10941526.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值