python迭代器
迭代器
- 在python中,对list,tuple,str等类型的数据可以使用for …in … 的循环语法,从其中依次拿到数据进行使用,这样的过程称为遍历,也叫迭代。
- 在python中,基本类型,列表,元组,字符串,字典都是可迭代的,而整数,浮点数,布尔数都是不可迭代的。
可迭代对象的本质
- 对可迭代对象进行迭代使用的过程,没迭代一次都会返回对象中的下一条数据,一直向后读取数据知道迭代了所有数据后结束。
- 在这个过程中,我们需要知道每次访问了第几条数据,以便下一次迭代返回的是下一条数据,不会跳过或者返回数据。python帮我们实现了这个功能,就是迭代器。
- 在python中,可迭代对象通过—iter—方法向我们提供一个迭代器,在迭代一个对象的时候,实际上就是先获取该对象的一个迭代器,然后通过这个迭代器来依次获取对象中的每一个数据。
- 可迭代对象是一个具备了—iter—方法的对象,通过—iter—方法获取可迭代对象的迭代器。
iter()函数与next()函数
列表、元组、字符串、字典等都是可迭代对象,我们可以通过iter()函数获取这些可迭代对象的迭代器。然后我们可以对获取到的迭代器不断使用next()函数来获取下一条数据。
1
2
3
4
5
6
7
8list_b = ['ppp', 'yyy', 'ttt', 'hhh', 'ooo', 'nnn']
iterator_b = iter(list_b)
print(next(iterator_b))
print(next(iterator_b))
print(next(iterator_b))
print(next(iterator_b))
print(next(iterator_b))
print(next(iterator_b))执行结果
1
2
3
4
5
6
7
ppp
yyy
ttt
hhh
ooo
nnniter()函数是把可迭代对象的迭代器取出来,内部是调用了可迭代对象的—iter—方法,来取得迭代器的。
next()函数是通过迭代器取得下一个位置的值,内部是调用了迭代器对象的—next—方法,来取得下一个位置的值。
当我们迭代完最后一个数据之后,再次调用next()函数会抛出Stoplteration的异常,来告诉我们数据全部迭代完毕,不再执行next()函数。
自定义迭代器
迭代器最核心的功能就是可以通过next()函数的调用来返回下一个数据值。
如果返回的数据值不是在一个已有数据集合中,而是通过程序按照一个规律计算好的生成,那就不在依赖一个已有数据集合,也就是说不用再将所有的迭代的数据一次性缓存下来,这样可以节省大量的储存空间。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29class Feibolterator():
"""斐波那契额数列迭代器"""
def __init__(self,n):
#费波数列值的个数
self.n = n
#记录当下遍历的下标
self.index = 0
# 斐波那契数列前面俩个值
self.num1 = 0
self.num2 = 1
def __next__(self):
"""使用next()函数调用获取下一个数"""
if self.index < self.n:
num = self.num1
self.num1,self.num2 = self.num2,self.num1 + self.num2
self.index +=1
return num
else:
raise StopIteration
def __iter__(self):
"""迭代器的_iter_返回自身即可"""
return self
if __name__ == '__main__':
fb = Feibolterator(20)
for num in fb:
print(num,end=",")执行结果
1
0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,
通过上面的代码中,我可以看到自定义一个类,里面实现了—next—和—iter—方法,next方法中每次返回的值是通过计算得到的结果,结果可以一直使用next()方法。