python 迭代器和生成器

本文属于个人对知识总结,若有不当或错误,还望各位看官纠正

  • 说到迭代器和生成器,就必须知道:
    • 可迭代对象;
    • 迭代器;
    • 生成器.

重要的写在前面

迭代器和生成器的区别和关系
生成器是迭代器的一种
迭代器是惰性执行的,调用一次执行一次
1.迭代器是对已知数据进行操作next()
2.生成器是通过算法计算,返回数据,一般生成器函数都会有 yield 这个关键字

什么是可迭代对象呢?

  • 我们已经知道可以对list、tuple、str等类型的数据使⽤for…in…的循环语法从其中依次拿到数据进⾏使⽤,这样的过程也被称为遍历,也叫迭代。
  • 总结 : 可遍历 (for ... in ... :)的对象,就是一个可迭代对象.

迭代器

  • 判断是否是迭代器

    • python中的 isinstance() 可以判断你传入的对象是否是某一特定的类型,是返回true,否返回false.
      • 用法:
      from collections import Iterable,Iterator
      l = [1,2,3,4,56,6,6,]
      print(isinstance(l,Iterable))  # true
      print(isinstance(l,Iterator))  # false
      lo = iter(l)  #获得  l  的迭代器对象
      print(isinstance(lo,Iterable))  # true
      print(isinstance(lo,Iterator))  # true
      
  • iter()函数,Python中的 iter( object[, sentinel]) 函数可用来返回一个迭代器对象,iter( )函数只传入一个参数时,参数必须为可迭代对象;当使用第二个参数sentinel(哨兵)时,第一个参数必须是一个可调用对象.

    • 迭代器简单使用
      l = [1,2,3,4,56,6,6,]
      lo = iter(l)
      for i in range(len(l):
      	print(next(lo))
      	
      # 在lo元素调用完之后,在使用next()
      print(next(lo))# 会报 StopIteration异常
      
  • 把一个类作为一个迭代器使用需要在类中实现两个方法 iter() 与 next() 。
    iter() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 next() 方法并* 通过 StopIteration 异常标识迭代的完成。

  • next() 方法(Python 2 里是 next())会返回下一个迭代器对象。

  • 例子请看 https://www.runoob.com/python3/python3-iterator-generator.html

生成器

  • 如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器(Generator)

    def gen():
        for i in range(10):
            n = i + 1
            yield n
    
    g = gen()
    print(g)
    print(next(g))
    for n in g:
        print(n)
    

输出结果
输出结果
解释: 语句 print(g) 输出的不是数据,而是一个生成器对象,需要使用next(),调用 gen() 函数, 不断的计算 n 的值,并通过 yield 返回 n 值.
yeild 当程序执行到 yield 这里时,系统一般会保存程序当前的执行状态,当下一次调用(此函数的next(n)),程序就会接着上一次保存的状态,继续执行.

总结:
迭代器和生成器的区别和关系
生成器是迭代器的一种
迭代器是惰性执行的,调用一次执行一次
1.迭代器是对已知数据进行操作next()
2.生成器是通过算法计算,返回数据,一般生成器函数都会有 yield 这个关键字

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值