Blueprint —— 入门笔记
2026/4/14 17:50:06
本文主要介绍了迭代与可迭代对象以及迭代器的基础知识。
迭代是指通过重复执行某个过程来逐项访问集合中的元素。在Python中,我们经常使用 for 循环进行迭代。
pythonprint("迭代的基本概念:")print("="*50)# 字符串迭代print("1. 字符串迭代:")forcharin"Hello":print(f"{char}")print("\n2. 列表迭代:")# 列表迭代fruits=["apple","banana","cherry"]forfruitinfruits:print(f"{fruit}")print("\n3. 字典迭代:")# 字典迭代person={"name":"Alice","age":25,"city":"New York"}forkeyinperson:print(f"{key}:{person[key]}")# 更优雅的字典迭代方式print("\n 字典项迭代:")forkey,valueinperson.items():print(f"{key}:{value}")print("\n4. 使用enumerate同时获取索引和值:")# 使用enumerate获取索引和值colors=["red","green","blue"]forindex,colorinenumerate(colors):print(f" 索引{index}:{color}")print("\n5. 使用zip同时迭代多个序列:")# 使用zip同时迭代多个序列names=["Alice","Bob","Charlie"]scores=[85,92,78]forname,scoreinzip(names,scores):print(f"{name}:{score}分")可迭代对象是实现了iter() 方法的对象,或者实现了getitem() 方法且参数从0开始索引的对象。Python中大多数容器类型都是可迭代的。
pythonfromcollections.abcimportIterableprint("可迭代对象判断:")print("="*50)# 判断各种类型是否为可迭代对象test_items=[("字符串","Hello"),("列表",[1,2,3]),("元组",(1,2,3)),("集合",{1,2,3}),("字典",{"a":1,"b":2}),("range对象",range(5)),("数字",123),("布尔值",True),("None",None),("文件对象",open(__file__,'r')),("生成器",(xforxinrange(3))),]forname,itemintest_items:try:is_iterable=isinstance(item,Iterable)print(f"{name:15}是可迭代对象:{is_iterable}")# 尝试使用for循环验证ifis_iterableandnamenotin["文件对象","生成器"]:# 对于文件对象和生成器,我们不在这里迭代print(f" 示例迭代: ",end="")count=0forelementinitem:ifcount<3:# 只显示前3个元素print(f"{element}",end=" ")count+=1else:print("...",end="")breakprint()exceptExceptionase:print(f"{name:15}检查出错:{e}")print()# 注意:对于文件对象需要关闭ifisinstance(test_items[9][1],Iterable):test_items[9][1].close()print("可迭代对象的特点:")print("1. 可以使用 for 循环进行遍历")print("2. 可以使用 iter() 函数获取迭代器")print("3. 可以使用解包操作")print("4. 可以作为某些函数的参数(如 sum(), max(), min())")pythonprint("自定义可迭代对象:")print("="*50)# 方法1:实现 __iter__() 方法classMyIterable1:"""通过实现 __iter__() 方法创建可迭代对象"""def__init__(self,data):self.data=datadef__iter__(self):# 返回一个迭代器returniter(self.data)# 方法2:实现 __getitem__() 方法classMyIterable2:"""通过实现 __getitem__() 方法创建可迭代对象"""def__init__(self,data):self.data=datadef__getitem__(self,index):returnself.data[index]def__len__(self):returnlen(self.data)# 测试自定义可迭代对象print("1. 实现 __iter__() 方法的类:")my_iter1=MyIterable1([10,20,30,40,50])print(f" 类型:{type(my_iter1)}")print(f" 是否可迭代:{isinstance(my_iter1,Iterable)}")print(" 迭代结果:",end=" ")foriteminmy_iter1:print(item,end=" ")print()print("\n2. 实现 __getitem__() 方法的类:")my_iter2=MyIterable2(["A","B","C","D","E"])print(f" 类型:{type(my_iter2)}")print(f" 是否可迭代:{isinstance(my_iter2,Iterable)}")print(" 迭代结果:",end=" ")foriteminmy_iter2:print(item,end=" ")print()print("\n3. 使用iter()函数获取迭代器:")# iter()函数的工作方式data=[1,2,3]iterator=iter(data)# 相当于 data.__iter__()print(f" 原始数据:{data}")print(f" 迭代器:{iterator}")print(f" next(iterator):{next(iterator)}")print(f" next(iterator):{next(iterator)}")print(f" next(iterator):{next(iterator)}")try:print(f" next(iterator):{next(iterator)}")exceptStopIterationase:print(f" 捕获 StopIteration 异常:{e}")print("\n4. 迭代器耗尽后重新获取:")# 迭代器只能使用一次,需要重新获取iterator1=iter(data)iterator2=iter(data)print(f" iterator1 - next():{next(iterator1)}")print(f" iterator2 - next():{next(iterator2)}")print(f" iterator1 - next():{next(iterator1)}")print(f" iterator2 - next():{next(iterator2)}")迭代器是实现了迭代器协议的对象,必须包含两个方法:
iter():返回迭代器自身
next():返回下一个元素,如果没有元素则抛出 StopIteration 异常
pythonfromcollections.abcimportIteratorprint("迭代器详解:")print("="*50)# 判断各种对象是否为迭代器test_objects=[("列表",[1,2,3]),("列表的迭代器",iter([1,2,3])),("字符串","abc"),("字符串的迭代器",iter("abc")),("range对象",range(3)),("range对象的迭代器",iter(range(3))),("生成器表达式",(xforxinrange(3))),]print("检查是否为迭代器:")forname,objintest_objects:is_iterator=isinstance(obj,Iterator)print(f"{name:20}是迭代器:{is_iterator}")print("\n迭代器的特点:")print("1. 迭代器一定是可迭代的")print("2. 迭代器只能前进,不能后退")print("3. 迭代器是惰性的,只在需要时计算下一个值")print("4. 迭代器只能遍历一次,遍历完后需要重新创建")