迭代是访问集合元素的一种方式
。
1.迭代器是⼀个可以记住遍历的位置的对象。迭代器对象从集合 的第⼀个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
- 如何判断⼀个对象是否可以迭代
可以使⽤ isinstance() 判断⼀个对象是否是 Iterable 对象
from collections import Iterable
# 使⽤isinstance() 函数检测某个对象是否是⼀个可迭代的对象
# 列表是可迭代对象
result = isinstance([1,2], Iterable)
print(result)
- 可迭代对象的本质 可迭代对象的本质就是: ⼀个对象所属的类中含有 iter() ⽅法,该对象就是⼀个可迭代对象。
2. iter()函数与next()函数
list、tuple等都是可迭代对象,我们可以通过iter()函数获取这些可迭代对象的迭代器。然后我们可以对 获取到的迭代器不断使⽤next()函数来获取下⼀条数据。iter()函数实际上就是调⽤了可迭代对象 的 iter ⽅法。
3. ⾃定义迭代器Iterator
⼀个类实现了 iter ⽅法和 next ⽅法的对象,就是⾃定义迭代器。
⾃定义迭代器类,必须满⾜如下:
1)实现 iter() ⽅法
2)实现 next() ⽅法
当调⽤iter(迭代器对象)时,会调⽤对象的 iter() ⽅法 当调⽤next(迭代器对象)时,会调⽤对象的 next() ⽅法 迭代器⾃身正是⼀个迭代器,所以迭代器的 iter()⽅法返回⾃身即可。
1 from collections.abc import Iterable
2 from collections.abc import Iterator
3 import time
4
5 class Classmate(object):
6 def __init__(self):
7 self.names=list()
8 self.current_num=0
9
10 def add(self,name):
11 self.names.append(name)
12
13 def __iter__(self):
14 """如果要使一个对象可以迭代,即可以使用for,必须实现__iter__方法"""
15 return self
16
17
18 def __next__(self):
19 if self.current_num<len(self.names):
20 result=self.names[self.current_num]
21 self.current_num+=1
22 return result
23 else:
24 raise StopIteration
25 mate=Classmate()
26 mate.add("王五")
27 mate.add("张三")
28 mate.add("李四")
29
30 #class_iterator=iter(mate)
31 #print("是否是可以迭代的ui对象:",isinstance(mate,Iterable))
32 #print("是否是迭代器:",isinstance(class_iterator,Iterator))
33 #print(next(class_iterator))
34 for name in mate:
35 print(name)
36 time.sleep(1)
1.判断xxx.obj是否是可迭代的(看是否有iter方法)
2.在前一步实现的前提下,调用iter(xxx)函数得到xxx.obj的iter()方法的返回值
3.__iter__方法的返回值是一个迭代器
4. for…in…循环的本质
for item in Iterable 循环的本质就是先通过iter()函数获取可迭代对象Iterable的迭代器,然后对获取到的 迭代器不断调⽤next()⽅法来获取下⼀个值并将其赋值给item,当遇到StopIteration的异常后循环结束。
5.迭代器-斐波那契数列
- 迭代器应⽤
我们发现迭代器最核⼼的功能就是可以通过next()函数的调⽤来返回下⼀个数据值。如果每次返回的数 据值不是在⼀个已有的数据集合中读取的,⽽是通过程序按照⼀定的规律计算⽣成的,那么也就意味 着可以不⽤再依赖⼀个已有的数据集合,也就是说不⽤再将所有要迭代的数据都⼀次性缓存下来供后 续依次读取,这样可以节省⼤量的存储(内存)空间。
1 class Fabonacci(object):
2 def __init__(self,all_num):
3 self.a=0
4 self.b=1
5 self.all_num=all_num
6 self.current_num=0
7
8
9 def __iter__(self):
10 return self
11
12 def __next__(self):
13 if self.current_num<self.all_num:
14 ret=self.a
15 self.a,self.b=self.b,self.a+self.b
16 self.current_num+=1
17 return ret
18 else:
19 raise StopIteration
20
21 fabonacci=Fabonacci(10)
22
23 for fabo in fabonacci:
24 print(fabo)
运行结果
0
1
1
2
3
5
8
13
21
34