迭代器与生成器区别

术语解释

1,迭代器协议:对象需要提供next()方法,它要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代。
2,可迭代对象:实现了迭代器协议对象。list、tuple、dict都是Iterable(可迭代对象),但不是Iterator(迭代器对象)。但可以使用内建函数iter(),把这些都变成Iterable(可迭代器对象)。
3,for item in Iterable 循环的本质就是先通过iter()函数获取可迭代对象Iterable的迭代器,然后对获取到的迭代器不断调用next()方法来获取下一个值并将其赋值给item,当遇到StopIteration的异常后循环结束

python内置函数

iter()返回一个定义了next()方法的迭代器对象或者是调用迭代器对象的__iter__方法
next()调用迭代器对象的__next__方法

迭代器

迭代器可以通过list()或tuple()转成列表和元组
Python中一个实现了__iter__方法和__next__方法的类对象,每次循环这个类对象都会产生一个迭代器
其实每次循环可迭代对象(list,tuple,dic)都会产生一个迭代器

如下案例是计算菲波那切数列的案例

class Fib(object):
    def __init__(self, max):
        super(Fib, self).__init__()
        self.max = max
    def __iter__(self):
        self.a = 0
        self.b = 1
        return self
    def __next__(self):
        fib = self.a
        if fib > self.max:
            raise StopIteration
        self.a, self.b = self.b, self.a + self.b
        return fib
if __name__ == '__main__':
    # 20以内的数
    fib = Fib(20)
    for i in fib:
        print(i)

生成器

延迟操作。也就是在需要的时候才产生结果,不是立即产生结果。
使用生成器表达式取代列表推导式可以同时节省 cpu 和 内存

1.使用yield的函数
2.生成器表达式,a = (i for i in range(10)),这个a不是元组,而是一个生成器,循环一次后为空,不循环不产生

python内置的一些函数,可以识别这是生成器表达式,外面有一对小括号,就是生成器
time_start = time.time()
result1=sum(a for a in range(54545245))
print(time.time()-time_start) #2.87s
time_start = time.time()
result2=sum([a for a in range(54545245)])
print(time.time()-time_start) #3.36s

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值