在python甚至编程中都经常能看到迭代,所谓迭代就是访问集合元素的一种方式,我们对可以对迭代对象进行依次拿取的过程称为遍历,也叫做迭代,而在python中常见的可以迭代的对象有元组,列表,字典,集合,range,字符串,而如何通过代码得知我们的对象是否是可以迭代的呢,我们导入collections模块的Iterable类,通过isinstance()方法返回的布尔值True/False来判断是否可迭代:
from collections import Iterable # 列表,元组,字典,字符串,集合,range 等对象都是可迭代对象 # 判断对象是否是可迭代对象 result = isinstance([3, 5], Iterable) print("列表是否是可迭代对象:", result) result = isinstance((3, 5), Iterable) print("元组是否是可迭代对象:", result) result = isinstance({"name": "陈晓", "age": 20}, Iterable) print("字典是否是可迭代对象:", result) result = isinstance({3, 5}, Iterable) print("集合是否是可迭代对象:", result) result = isinstance("苹果", Iterable) print("字符串是否是可迭代对象:", result) result = isinstance(range(5), Iterable) print("range是否是可迭代对象:", result) # for i in 5: # print(i) result = isinstance(5, Iterable) print("int对象是否是可迭代对象:", result) # 提示: 可以判断对象是否是指定类型 result = isinstance(5, int) print("int对象是否是类型:", result) # 扩展-根据isinstance可以判断参数的类型 def show(name, age): if not isinstance(age, int): print("age不是int类型") print(name, age) show("陈晓", "20") class Student(object): pass stu = Student() # 判断对象是否是指定类型 result = isinstance(stu, Student) print(result) # int, 默认自定义对象都是不能迭代的,不是可迭代对象
可以容易得到下面的结果:
列表是否是可迭代对象: True
元组是否是可迭代对象: True
字典是否是可迭代对象: True
集合是否是可迭代对象: True
字符串是否是可迭代对象: True
range是否是可迭代对象: True
int对象是否是可迭代对象: False
int对象是否是类型: True
age不是int类型
鹿晗 20
True
可迭代对象通过__iter__
方法向我们提供一个迭代器,我们在迭代一个可迭代对象的时候,实际上就是先获取该对象提供的一个迭代器,然后通过这个迭代器来依次获取对象中的每一个数据.
那么也就是说,一个具备了__iter__
方法的对象,就是一个可迭代对象。
下面我们写一个自定义的可迭代对象:
# 自定义可迭代对象: 在类里面提供一个__iter__方法创建的对象就是可迭代对象 from collections import Iterable class StudentList(object): def __init__(self): super(StudentList, self).__init__() self.my_list = list() # 添加信息 def append_item(self, item): # 添加数据到系统的列表 self.my_list.append(item) # 可迭代对象方法 def __iter__(self): # 可迭代对象之所能够迭代数据是通过迭代器完成的-> 可迭代对象的本质就是通过迭代器把数据依次迭代出来的 pass student_list = StudentList() student_list.append_item("苹果") student_list.append_item("西瓜") result = isinstance(student_list, Iterable) print(result) # for value in student_list: # print(value)
上面的代码重点放在__iter__()方法上面,而且这个方法里面我没有写任何代码,pass只是表示代码不报错。执行结果为:True
但是这个对象虽然是判断为可迭代,但是他不能通过我们的for循环取遍历,因为他不具有迭代器。如果放开我注释里的最后两行代码,就会报错
那什么是迭代器呢?
一个实现了__iter__
方法和__next__
方法的对象,就是迭代器,所以,我们要想构造一个迭代器,就要实现它的__next__
方法。但这还不够,python要求迭代器本身也是可迭代的,所以我们还要为迭代器实现__iter__
方法,而__iter__
方法要返回一个迭代器,迭代器自身正是一个迭代器,所以迭代器的__iter__
方法返回自身即可。
通过下面我们创建自定义的迭代器对象:
# 自定义迭代器对象: 在类里面提供__iter__和__next__方法创建的对象就是迭代器 # 自定义可迭代对象: 在类里面提供一个__iter__方法创建的对象就是可迭代对象 from collections import Iterable from collections import Iterator clas StudentList(object): def __init__(self): super(StudentList, self).__init__() self.my_list = list() # 添加信息 def append_item(self, item): # 添加数据到系统的列表 self.my_list.append(item) # 可迭代对象方法 def __iter__(self): # 可迭代对象之所能够迭代数据是通过迭代器完成的-> 可迭代对象的本质就是通过迭代器把数据依次迭代出来的 student_iterator = StudentIterator(self.my_list) result = isinstance(student_iterator, Iterator) print("student_iterator:", result) return student_iterator # 自定义迭代器 class StudentIterator(object): def __init__(self, my_list): super(StudentIterator, self).__init__() self.my_list = my_list # 记录当前元素的下标 self.current_index = 0 def __iter__(self): return self # 获取迭代器中下一个值 def __next__(self): if self.current_index < len(self.my_list): value = self.my_list[self.current_index] # 取值完成以后需要对下标加上1 self.current_index += 1 return value else: # 超出范围抛出停止迭代的异常 raise StopIteration # 创建可迭代对象 student_list = StudentList() student_list.append_item("苹果") student_list.append_item("西瓜") result = isinstance(student_list, Iterable) print(result) for value in student_list: print(value)
执行结果:
True
student_iterator: True
苹果
西瓜
代码分析:
首先我们导入必要的模块,紧接着我们创建了一个StudentList的新式类,类里写了三个方法,第一个方法是初始化__init__方法,我们让他复写了父类的__init__,再给他带了一个空列表作为他的my_list属性,然后添加了append_item()方法用来往my_list添加内容,最后定义__iter__方法,在__iter__方法里调用了接下来我们准备好的自定义迭代器类实例化的对象,并且用return返回,而这个对象刚好是我们需要的迭代器,在StudentIterator这个类里面,我们还是初始化了父类init,并把my_list给传过来作为自己的属性,并且增加了一个记录当前元素下表的current-index,从0开始计数。。。算了不说了一切竟在代码中。。。