迭代器和生成器

迭代器和生成器


一、迭代器和生成器

       当列表、元组、字典、集合中的元素很多时,如几百万、几亿甚至更多,这些元素一次性全放在内存里,它们将占据大量的内存资源。迭代器和生成器就是为了这问题而提出的。使用迭代器和生成器,不会一次性把所有元素加载到内存,而是在需要的时候才生成返回结果。它们既可以存储很多甚至无限多的数据,又不会占用太多资源。利用生成器或者迭代器来存储数据的方式,在大数据处理、机器学习中经常使用。

       序列、元组、字典及集合都是可迭代对象,可用在for、while等语句中。这些数据结构又称容器,在容器中使用iter()可得到迭代器,利用next()函数就可持续取值,知道取完为止。

       (1)容器是一系列元素的集合,str,list,set,dict,file,sockets对象都可以看作容器,容器都可以被迭代(用在for、while等语句中),因此它们被称为可迭代对象。

       (2)可迭代对象实现__iter__方法,该方法返回一个迭代器对象。

       (3)迭代器持有一个内部状态的字符,用于记录下次迭代的返回值,它实现了__next__和__iter__方法,迭代器不会一次性把所有元素加载到内存,而是在需要的时候才生成返回结果。

       (4)生成器是一种特殊的迭代器,它的返回值不是通过return得到的,而是通过yield得到的

二、迭代器

       用iter()函数可以把列表、元组、字典、集合等对象转换为迭代器。迭代器是python最强大的功能之一,是访问集合元素的一种方式。迭代器可以记住遍历的位置的对象,迭代器对象使用next()函数,从集合的第一个元素开始访问,直到所欲哦的元素被访问完位置。迭代器只能往前,不能后退

1.定义一个列表

代码如下(示例):

lst1 = {10, 20, 30, 40, 50}
for i in lst1:
    print(i, end=" ")

2.生成迭代器

       对列表、元组、字典和集合使用iter()函数,即可转换为迭代器
代码如下(示例):

iter1 = iter(lst1)
print(type(iter1))

3.从迭代器中取元素

while True:
    try:
        print(next(iter1), end=" ")
    except StopIteration:
        break

       使用next()从迭代器中取数,知道没有数据(即StopIteration)则触发break语句。

二、生成器

       生成器可分为生成器函数和生成器表达式。生成器表达式是列表推导式的生成器版本,看起来像列表推导式,但是它返回的是一个生成器对象而不是列表对象。
       生成器表达式与列表推导式相似,列表推导式是在中括号里,把中括号改为小括号则变成生产器

gen01 = (2 * x + 1 for x in range(10))
print(type(gen01))

# 用for循环从生成器中取数据
for i in gen01:
    print(i, end=" ")
# 1 3 5 7 9 11 13 15 17 19 

       或用next()函数从生成器中逐一取数据,与for循环取数效果一样

while True:
    try:
        print(next(gen01), end=" ")
    except StopIteration:
        break
# 1 3 5 7 9 11 13 15 17 19 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

就这样学着吧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值