生成器generetor

生成器generetor

generator是一种特殊的可迭代对象iterable。主要目的为节约内存, 后边元素没有用到时就暂时不创建,访问时才会生成。创建方式分两种:
1、(i*2 for i in range(10)) 列表生成器;
2、推算算法比较复杂,用列表推导式不能实现时,用函数的yield功能实现。生成器由于访问前由于没创建,因此不支持列表的切片操作,如 a[100]

以下时一个典型的生成器实例,断点调试可以清楚看到具体的执行流程。

import time

def consumer(name):
    print('%s开始吃包子了'%name)
    while 1:
        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)
        c.send(i)
        c2.send(i)
producer('zouweidg')

不用yield实现一个斐波那契(Fibonacci)数列生成器:

class Fib(object): 
 
   def __init__(self, max): 
       self.max = max 
       self.n, self.a, self.b = 0, 0, 1 
 
   def __iter__(self): 
       return self 
 
   def __next__(self): 
   #注意函数的定义形式,必须是__next__
       if self.n < self.max: 
           r = self.b 
           self.a, self.b = self.b, self.a + self.b 
           self.n = self.n + 1 
           return r 
       raise StopIteration()
    

Fib 类通过 next() 不断返回数列的下一个数,内存占用始终为常数:

for n in Fib(5): 
	print (n)

用yield实现一个generator:

def fib(end = 5):
    prev,curr=0,1
    while curr < end:
        yield curr
        prev,curr=curr,curr+prev

for i in fib():
    print(i)

输出:
1
1
2
3
5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值