迭代器:
1. 认识迭代器
迭代器是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问, 直到所有的元素被访问完结束. 迭代器只能往前不会后退.
我们怎样才能判定一个对象是都是可以迭代的呢?
2. 可迭代对象
list,tuple,str 等类型的数据使用 for...in... 的循环语法从其中依次拿到数据进行使用, 这类对象被称为可迭代对象
3. 如何判断一个对象是否是一个可迭代对象
可以使用 isinstance() 判断一个对象是否是 Iterable 对象
- from collections import Iterable
- # 使用 isinstance() 函数检测某个对象是否是一个可迭代的对象
- # 列表是可迭代对象
- result = isinstance([1,2], Iterable)
- print(result)
- # 元组是可迭代对象
- result = isinstance((1,2), Iterable)
- print(result)
- # 字符串是可迭代对象
- result = isinstance("hello", Iterable)
- print(result)
- # 字典是可迭代对象
- result = isinstance({"a": 10, "b": 100}, Iterable)
- print(result)
- # 数字不是可迭代对象
- result = isinstance(100, Iterable)
- print(result)
- # 定义类
- class MyClass(object):
- pass
- # 创建对象
- c1 = MyClass()
- # 对象 c1 不是可迭代对象
- result = isinstance(c1, Iterable)
- print(result)
运行结果
- True
- True
- True
- True
- False
- False
4. 如何将一个不可迭代的对象转换为可迭代对象:
在探讨这个问题之前我们需要了解, 可迭代对象的本质: 可以向我们提供一个这样的中间 "人" 即迭代器帮助我们对其进行迭代遍历使用. 而在 python 中内置的魔法方法__iter__() 方法可以将一个对象转换为可迭代对象, 因此只要一个类中有__iter__() 方法, 那么这个类实例出的对象就是个可迭代对象, 接下来我们你验证下:
- from collections import Iterable
- # 使用 isinstance() 函数检测某个对象是否是一个可迭代的对象
- class MyClass(object):
- # 可迭代对象的本质是, 类中是否定义了 __iter__() 方法
- def __iter__(self):
- return self
- c1 = MyClass()
- # 对象 c1 不是可迭代对象
- result = isinstance(c1, Iterable)
- print(result)
运行结果
true
5. 创建一个迭代器类
那么上面的创建的迭代对象能用 next() 访问吗? 结果肯定是不能的, 我们虽然在类中定义了一个__iter__() 方法, 但我们并没有定义一个函数去迭代这个类, 这时我们需要用 python 的内置方法__next__() 去迭代这个对象, 接下来我们会分别创建一个迭代器和迭代对象去 s 验证:
- from collections import Iterable
- from collections import Iterator
- class StudentList(object):
- def __init__(self):
- # 创建列表
- self.items = list()
- def addItem(self,item):
- # 追加元素到列表中
- self.items.append(item)
- def __iter__(self):
- # 创建迭代器对象
- studentIterator = StudentIterator(self.items)
- # 返回迭代器对象
- return studentIterator
- # 定义迭代器
- class StudentIterator(object):
- # 定义构造方法
- # 1) 完成 索引下标定义和初始化
- # 2) 接收要遍历的列表值
- def __init__(self, items):
- self.items = items
- self.current_index = 0
- def __iter__(self):
- return self
- def __next__(self):
- # 判断位置是否合法
- if self.current_index < len(self.items):
- # 根据 current_index 返回列表值
- item = self.items[self.current_index]
- # 让 下标 + 1
- self.current_index += 1
- # 返回元素内容
- return item
- else:
- # 停止迭代
- # 主动抛出异常, 迭代器没有更多的值 (到了迭代器末尾)
- raise StopIteration
- # 实例化对象
- stulist = StudentList()
- stulist.addItem("小明")
- stulist.addItem("小红")
- stulist.addItem("小刚")
- # 检查是否是可迭代对象
- result = isinstance(stulist, Iterable)
- print(result)
- for value in stulist:
- print(value)
- image-20180704185515374
运行结果
小明
小红
小刚
注意: 如果我们用 next() 访问的次数超过迭代对象的范围会报错, 也许你会疑问为什么平时我们遍历列表, 元组等可迭代对象时为什么没有这种情况, 那是因为 python 内部在我们遍历可迭代对象时超出范围会自动停止, 我们定义迭代器类时直接抛出错误了, 没有做那么复杂的处理.
来源: https://www.cnblogs.com/xuchuankun/p/9508329.html