python-------------生成器与迭代器

python中的迭代器与生成器

迭代器:
迭代器就像for循环遍历,但唯一不一样的地方我们进一步探索
首先用for循环遍历一个列表如下

a=[1,2,3,4,5,6]
for i in a:
    print(i)

我们在用迭代器进行遍历一个列表如下:
a=[1,2,3,4,5,6]
b=iter(a)
print(next(b))
print(next(b))
# print(next(b))
# print(next(b))
# print(next(b))
# print(next(b))

 在这里插入图片描述

 总结:我们可以清晰的看出for遍历一个列表会全部遍历,而迭代器可以记住遍历的位置对象,迭代器对象从列表的第一个元素开始访问,直到所有的元素被访问完结束,迭代 器只能往前不会后退。 其中通过iter(iterable)从可迭代对象中返回一个迭代器,iterable必须是能提供 一个迭代器的对象,然后通过 next(iterator) 从迭代器iterator中获取下一了记录,如果无法获取下 一条记录,则触发stoptrerator异常,从中我们可以看出iter函数是可以返回一个可迭代对象的迭代器,这样一来遍历就可控了好多。
迭代器的应用:
在python中好多内置函数就用到了迭代器原理,就拿最有代表的map()函数来说吧,先看一组代码:
 

lst=[1,2,3,4,5,6]
def pingfang(x):
    return x*x
ret=map(pingfang,lst)
print(ret)
for i in ret:
    print(i)

在这里插入图片描述

总结:我们可以看到map()函数,第一个参数是一个函数,第二个参数是可迭代的内容。 函数会依次作用在可迭代内容的每一个元素上进行计算,然后返回一个新的可迭代内容。 虽然新的内容存在内存地址中需要进行遍历,但是迭代器切实优化了计算方式,减少了代码量。
生成器:
都说迭代器是生成器,并且他还包含一个yield关键字,那我们进一步探索一下
首先我们用平常的代码书写一下斐波那契数:
 

def fbnq(n):
    a,b,i=0,1,0
    while i<n:
        a,b=b,a+b
        print(a)
        i+=1
f=fbnq(10)

在这里插入图片描述

 然后我们在用生成器实现一下斐波那契数:

def fbnq(n):
    a,b,i=0,1,0
    while i<n:
        a,b=b,a+b
        yield a
        i+=1
f=fbnq(10)
print(f)
for i in f:
    print(i)

在这里插入图片描述

总结:从上面的对比我们不难看出个函数中包含yield关键字,那么这个函数就不再是一个普通函数,而是 一个生成器,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是 一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运 行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。 调用一个生成器函数,返回的是一个迭代器对象。
生成器的作用:
列表所有数据都在内存中,如果有海量数据的话将会非常耗内存。如果列表元素按照某种算法推算出来,那我们就可以在循环的过程中不断推算出 后续的元素,这样就不必创建完整的list,从而节省大量的空间。 简单一句话:我又想要得到庞大的数据,又想让它占用空间少,那就用生成器
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值