迭代器:
from collections import Iterable
迭代器
迭代是python最强大的功能之一,是访问集合元素的一种方式。
字符串,列表或元组对象都可用于创建迭代器:
字符串,列表或元组==>(Iterable object)可迭代对象
迭代器是一个可以记住遍历的对象的上一个位置。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:__Iter__()和__next__()。
__Iter__方法:返回迭代器自身。可以通过python内建函数__Iter__()调用.
__next__方法:当next方法被调用的时候,迭代器会返回他的下一个值,如果next方法被调用,但迭代器没有
只可返回,就会引发一个StopIteration异常。该方法可以通过python内建函数next()调用。
迭代器内部持有一个状态,该状态用于记录当前迭代所在的位置,
以方便下次迭代的时候获取正确的元素。迭代器有一种具体的迭代器类型,比如list_iter, set_iterator。可迭代对象实现了__iter__方法,该方法返回一个迭代对象。
内建函数iter()可以从迭代对象中获得的迭代器。
迭代对象:list tuple dict str set
it=iter(list) # 创建迭代对象
创建一个迭代器有三种方法,其中前两种分别是:
1.为容器对象添加__iter__()和__next__()方法
2.__iter__()返回迭代器本身self,__next__()则返回每次调用next()或迭代时的元素
#自定义一个迭代器 class Container: def __init__(self,start,end): self.start=start self.end=end def __iter__(self): print('调用了__iter__(self)方法') return self #返回迭代器 对象本身 def __next__(self): if self.start<self.end: i=self.start self.start=self.start+1 return i else: raise StopIteration() Cont=Container(0,10) for i in Cont: print(i)
输出结果:
调用了__iter__(self)方法 0 1 2 3 4 5 6 7 8 9
2.内置函数Iter()将可迭代对象转化为迭代器
3.就是生成器(generator)。生成器通过yield语句快速生成迭代器,省略了复杂的__iter__()&__next__()方式
生成器:
第一种方式:将列表[]改为(),里面可以写推到
生成器只要通过next()方法即可得到下一个值,到最后一个后一场(StopIteration)退出
用表达式做生成器
例:
text=(x for x in range(10))
next(text) 或text.__next__()
#生成器:generater #第一种创建方式:推导 nums=(x for x in range(10)) print(nums) print(next(nums)) print(next(nums)) print('请王老师吃饭真开心。。') print(next(nums)) print(nums.__next__())
输出结果:
<generator object <genexpr> at 0x055CFD80> 0 1 请王老师吃饭真开心。。 2 3
第二种方式:斐波那契 :将print换成yield,每次生成一个值
但是调用方法时没有结果
在方法内使用yield做生成器,这样调用此方法时,会得出一个结果:generator object ...
然后也是可以调用next()
每到yield时,就会停止,返回当前这个值,可以一次一次next()调用,看看运行过程
生成器可以被循环迭代,知道循环结束
import collections
print(isinstance([],collections.Iterable)) #True
print(isinstance(iter([]),collections.Iteraror)) #True
print(isinstance(iter([]),collections.Iterarable)) #True
#斐波那契 #1,1,2,3,5,8,13,21,34,55,89 fei=[] for i in range(20): if i>1: fei.append(fei[i-1]+fei[i-2]) else: fei.append(1) print(fei[i],end=' ')
输出结果:
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
fei=[] def feibonaqi(): for i in range(20): if i>1: fei.append(fei[i-1]+fei[i-2]) else: fei.append(1) yield(fei[i]) print(feibonaqi())
输出结果:
<generator object feibonaqi at 0x0563ED80>