python中迭代器和可迭代对象的区别_python中生成器和迭代器以及可迭代对象的区别...

版权声明:转载请注明出处https://blog.csdn.net/fanlei5458/article/details/80138860

先简单的总结一下三种之间的关系:

生成器和迭代器都是可迭代对象, 而生成器是一类特殊的迭代器.对于生成器和迭代器我们都可以使用next()函数来获取其下一个返回值,当然也可以使用for...in...来获取他们的返回值,因为for...in...的本质其实就是不断的对对象不断的调用next()方法,关于for...in...的本质可在for...in...内部实现原理中查看.

然后在进行分别说明:

可迭代对象: 在python中通俗的来讲就是能够通过for...in...这类语句迭代读取一条数据供我们使用的对象就称之为可迭代对象(Iterable)例如列表(list),元组(tuple)等,我们还可以通过isinstance(obj, Iterable)来判断一个对象是不是可迭代对象.如果对象是可迭代对象则,isinstance的结果返回True>>> from collections import Iterable

>>> obj = ['a','b',1,2]

>>> isinstance(obj, Iterable)

True

>>> obj_1 = {3,5,6,7,2}

>>> isinstance(obj_1, Iterable)

True    迭代器:  迭代器是一种对象,它能够记录可迭代对象每次迭代的数据的地址,以便每次迭代都可以返回下一条数据.在python中只要一个类实现了__iter__方法和__next__方法,那么这个类的实例对象就是一个迭代器.我们可以通过isinstance(obj_1, Iterator)来判断一个对象是不是可迭代对象,如果是则isinstance返回True.from collections import Iterator

class Desc(object):

def __iter__(self):

pass

def __next__(self):

pass

def main():

print(isinstance(Desc(), Iterator))

if __name__ == '__main__':

main()上面代码执行的结果为 True

生成器(generator)和迭代器的实现方式不一样,生成器可以通过生成器推导式或yield关键字来实现,两种方式如下:>>> gen = (i for i in range(10000))

>>> gen

at 0x00000000035DE200>def fib(n):

current = 0

num1, num2 = 0, 1

while current < n:

num = num1

num1, num2 = num2, num1 + num2

current += 1

yield num

return 'done'In [31]: F = fib(5)

In [32]: next(F)

Out[32]: 1

In [33]: next(F)

Out[33]: 1

In [34]: next(F)

Out[34]: 2

In [35]: next(F)

Out[35]: 3

In [36]: next(F)

Out[36]: 5

In [37]: next(F)

---------------------------------------------------------------------------

StopIteration Traceback (most recent call last)

in ()

----> 1 next(F)

StopIteration: done对于上面这种使用yield方式创建的生成器,当我们next()去调用的时候, 函数fib会返回yield后面的值,并将函数fib挂起,当再次使用next()去调用的时候,函数fib接下来的逻辑(即while)会被继续执行,当while循环完之后如果在去使用next()调用函数fib就会抛出StopIteration  异常,而不会返回done,如果想获得返回值,则必须将异常捕获.

结束语:本篇文章可能语言上表达的不是很清楚,如果大家有什么疑惑,或者指正的地方欢迎在评论区一起讨论

阅读更多

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值