生成器与迭代器

# (x for x in range())  类型:生成器(第一种定义)
# [x for x in range()]  类型:列表对象

#回收机制
# a=1
# b=a
# a=2
# b=10
#当一个数据没有被指向时会被回收,1被回收
def foo():
    print('111')
    yield 1
    print('222')
    yield 2
#
# next(foo())

for i in foo():
    print(i)

输出

111
1
222
2
生成器的一个例子
# # 生成器例子
#
# def fib(max):
#     n,before,after=0,0,1
#
#     while n<max:
#         yield before
#         before,after=after,before+after
#         n=n+1

 before,after=after,before+after 先对右边计算再赋值
与before=after
after=before+after不同

生成器的send方法

# def bar():
#     print('ok1')
#     count=yield 1
#     print(count)
#     yield 2
#
# b=bar() #yield时bar()是一个生成器对象
# s=b.send(None)#next() 第一次send前如果没有next,只能传一个send(None)
# print(s)
# b.send('2e') #'2e传给count
举例

import time
def consumer(name):
    print("%s 准备吃包子啦!" %name)
    while True:
       baozi = yield   #baozi接收send中传入的值

       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)   #生成器用send传入值
        c2.send(i)

producer("alex")
A 准备吃包子啦!
B 准备吃包子啦!
老子开始准备做包子啦!
做了2个包子!
包子[0]来了,被[A]吃了!
包子[0]来了,被[B]吃了!
做了2个包子!
包子[1]来了,被[A]吃了!
包子[1]来了,被[B]吃了!


 什么是迭代器?
满足两个条件 1、有iter方法  2、有next方法

for 循环内部三件事:
    1、 调用可迭代对象的iter方法返回一个迭代器对象

    2 、不断调用迭代器对象的next方法

while:
    try:
        i=next(list_Iterator)
    except StopIteration
        break

    3、处理StopIteration


生成器是特殊迭代器,迭代器不一定是生成器

注意:生成器在创建的时候已经决定了能计算出值的个数调用next的次数超过这个值就会包StopIteration



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值