关于我对可迭代对象,迭代器,生成器的一些理解

本文深入探讨Python中的可迭代对象、迭代器和生成器的概念,解析它们的工作原理及如何自定义这些对象,同时对比了三者之间的区别,帮助读者掌握Python高级特性。
可迭代对象(iterable):
可以返回一个迭代器的对象可以称之为可迭代对象。本质上,具备了_iter_方法的对象是可迭代对象。在python中我们可以通过isinstance()判断一个对象是否是可迭代对象,常见的可迭代对象有:list,set,dict,tuple,str。
In [1]: from collections import Iterable

In [2]: isinstance([],Iterable)
Out[2]: True

In [3]: isinstance(set(),Iterable)
Out[3]: True

In [4]: isinstance(dict(),Iterable)
Out[4]: True

In [5]: isinstance((1,),Iterable)
Out[5]: True

In [6]: isinstance('hello world',Iterable)
Out[6]: True
__iter__方法:可以返回一个迭代器
自定义简单的可迭代对象
In [7]: class A(object):
  ...:     def __iter__(self):
  ...:         """返回一个迭代器"""
  ...:         pass  

In [8]: a = A()
In [9]: isinstance(a,Iterable)
Out[9]: True
迭代器(Iterator):
在调用next()方法的时候返回可迭代对象中的下一个值的对象可称为迭代器。本质上,实现 __iter__方法和__next__(python2中next())方法的对象就是迭代器(从这里可以看出迭代器本身也是可迭代对象)
In [10]: from collections import Iterator

In [11]: isinstance([], Iterator)
Out[11]: False

In [12]: isinstance(iter([]), Iterator)
Out[12]: True

In [13]: isinstance(iter("abc"), Iterator)
Out[13]: True
__iter__方法:可以返回迭代器本身
__next__方法:可以返回可迭代对象中的下一个值,如果可迭代对象中没有下一个值了,则会抛出StopIteration异常。
在python中我们可以使用isinstance()方法判断一个对象是否为迭代器对象。
自定义简单的迭代器
In [14]: class B(object):
  ...:
  ...:     def __next__(self):
  ...: “”“记录当前迭代位置”“”
  ...:         pass
  ...:
  ...:     def __iter__(self):
  ...: “”“返回迭代器本身”“”
  ...:         pass
  ...:    

In [15]: b = B()

In [16]: from collections import Iterator

In [17]: isinstance(b,Iterable)
Out[17]: True
生成器(generator)
一次生成一个值的特殊类型函数可称为生成器。简单的说就是在函数的执行过程中,yield语句会把你需要的值返回给调用生成器的地方,然后退出函数,下一次调用生成器函数的时候又从上次中断的地方开始执行,而生成器内的所有变量参数都会被保存下来供下一次使用。
当我们自己实现一个迭代器的时候,当前迭代到的状态需要自己记录,进而才能根据当前状态生成下一个数据,而生成器可以通过yield语句记录当前状态,即生成器是一类特殊的迭代器。
由于生成器是特殊的迭代器所以生成器可以通过next()函数,for循环,list()等方法使用
tips:在python3在中range()方法返回的对象是一个生成器对象,python2中则是返回遍历结果
使用生成器写斐波那契数列
In [18]: def fib(n):
  ....:     current = 0
  ....:     num1, num2 = 0, 1
  ....:     while current < n:
  ....:         num = num1
  ....:         num1, num2 = num2, num1+num2
  ....:         current += 1
  ....:         yield num
  ....:     return 'None'
yield语句:python解释器执行到yield这一行时会停下,将yield后面的变量返回,再次调用激活yield(调用next()方法等)的时候,会继续执行yield后面的代码(python3中return后面可以添加返回值,python2中return只能退出生成器,后面不能添加返回值)

总结:

1.可迭代对象是可以进行迭代操作的对象,具有iter方法,调用iter方法可以返回一个迭代器

2.迭代器是特殊的可迭代对象,可以记录当前访问位置的对象,具有next方法,当通过next()调用next(python2中为next)方法时,会返回下一个位置的值。迭代器是一个特殊的可迭代对象,当调用iter方法时,会将自己返回。

3.生成器是特殊的迭代器,他自动记录当前迭代的状态,当我们调用调用next()方法的时候会帮我们从上一次停下来的地方继续执行

转载于:https://www.cnblogs.com/silencehuliang/p/9788126.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值