Python中的可迭代对象
可迭代对象的概念及其使用:
可迭代对象,即可以进行迭代操作的一类对象。
迭代是访问集合元素的⼀种⽅式。迭代器是⼀个可以记住遍历的位置的对象。迭代器对象从集合的第⼀个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代是对元素进行的一种遍历,python语法 for element in Iterable:
判断一个对象可迭代:
用isinstance(Object, Iterable)判断一个对象是否是Iterable对象:
1 from collections import Iterable 2 # 使⽤isinstance() 函数检测某个对象是否是⼀个可迭代的对象 3 4 # 列表是可迭代对象 5 result = isinstance([1,2], Iterable) 6 print(result) 7 8 # 元组是可迭代对象 9 result = isinstance((1,2), Iterable) 10 print(result) 11 12 # 字符串是可迭代对象 13 result = isinstance("hello", Iterable) 14 print(result) 15 16 # 字典是可迭代对象 17 result = isinstance({"a": 10, "b": 100}, Iterable) 18 print(result) 19 20 # 数字不是可迭代对象 21 result = isinstance(100, Iterable) 22 print(result)
可迭代对象是实现:
可迭代对象的本质是,构造对象的类中含有__iter__()方法,该方法返回一个可迭代对象。在python的内置语法中,执行可迭代对象的迭代操作都是调用__iter__()方法获取一个可迭代对象,然后通过该对象的__next__()来获取该对象的相关数据。
1 from collections.abc import Iterable 2 3 4 class MyList(object): 5 def __init__(self): 6 self.item = list() 7 8 def addItem(self, data): 9 self.item.append(data) 10 11 def __iter__(self): 12 print('调用MyList_iter方法') 13 mylist_iterator = MyListIterator(self.item) 14 return mylist_iterator 15 16 17 class MyListIterator(object): 18 def __init__(self, item): 19 self.item = item 20 self.current_index = 0 21 22 # def __iter__(self): 23 # pass 24 25 def __next__(self): 26 print('调用MyListIterator_next方法') 27 if self.current_index < len(self.item): 28 data1 = self.item[self.current_index] 29 self.current_index += 1 30 return data1 31 else: 32 raise StopIteration 33 34 35 if __name__ == '__main__': 36 mylist = MyList() 37 mylist.addItem("张三") 38 mylist.addItem("李四") 39 mylist.addItem("王五") 40 for value in mylist: 41 print(value) 42 result = isinstance(mylist, Iterable) 43 print(result)
输出结果:
- 当调⽤iter(迭代器对象)时,会调⽤对象的 __iter__() ⽅法
- 当调⽤next(迭代器对象)时,会调⽤对象的 __next__() ⽅法
for...in...循环的实现过程:
for item in Iterable 循环的本质就是先通过iter()函数获取可迭代对象Iterable的迭代器,然后对获取到的迭代器不断调⽤next()⽅法来获取下⼀个值并将其赋值给item,当遇到StopIteration的异常后循环结束。
文件对象也是一个可迭代对象:
1 try: 2 with open('cal_time.py', 'r', encoding='utf-8') as f: 3 # print(f.read(1024)) 4 print(f) 5 for i in f: 6 print(i) 7 print('-------') 8 except Exception as e: 9 print(e)
输出结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)