关于我对可迭代对象,迭代器,生成器的一些理解
可迭代对象(iterable)
可以返回一个迭代器的对象可以称之为可迭代对象。本质上,具备了__iter__方法的对象是可迭代对象。在python中我们可以通过isinstance()判断一个对象是否是可迭代对象,常见的可迭代对象有:list,set,dict,tuple,str。
实例
|
|
__iter__方法
可以返回一个迭代器
自定义简单的可迭代对象
|
|
迭代器(Iterator):
在调用next()方法的时候返回可迭代对象中的下一个值的对象可称为迭代器。本质上,实现 _iter__方法和__next_(python2中next())方法的对象就是迭代器(从这里可以看出迭代器本身也是可迭代对象)
实例
|
|
__iter__方法
可以返回迭代器本身
__next__方法
可以返回可迭代对象中的下一个值,如果可迭代对象中没有下一个值了,则会抛出StopIteration异常。
在python中我们可以使用isinstance()方法判断一个对象是否为迭代器对象。
自定义简单的迭代器
|
|
生成器(generator)
一次生成一个值的特殊类型函数可称为生成器。简单的说就是在函数的执行过程中,yield语句会把你需要的值返回给调用生成器的地方,然后退出函数,下一次调用生成器函数的时候又从上次中断的地方开始执行,而生成器内的所有变量参数都会被保存下来供下一次使用。
当我们自己实现一个迭代器的时候,当前迭代到的状态需要自己记录,进而才能根据当前状态生成下一个数据,而生成器可以通过yield语句记录当前状态,即生成器是一类特殊的迭代器。
由于生成器是特殊的迭代器所以生成器可以通过next()函数,for循环,list()等方法使用
tips:在python3在中range()方法返回的对象是一个生成器对象,python2中则是返回遍历结果
使用生成器写斐波那契数列
|
|
yield语句
python解释器执行到yield这一行时会停下,将yield后面的变量返回,再次调用激活yield(调用next()方法等)的时候,会继续执行yield后面的代码(python3中return后面可以添加返回值,python2中return只能退出生成器,后面不能添加返回值)
总结
***1.可迭代对象是可以进行迭代操作的对象,具有__iter__方法,调用__iter__方法可以返回一个迭代器 2.迭代器是特殊的可迭代对象,可以记录当前访问位置的对象,具有__next__方法,当通过next()调用__next__(python2中为next)方法时,会返回下一个位置的值。迭代器是一个特殊的可迭代对象,当调用__iter__方法时,会将自己返回。 3.生成器是特殊的迭代器,他自动记录当前迭代的状态,当我们调用调用next()方法的时候会帮我们从上一次停下来的地方继续执行***