Python 迭代器、生成器、可迭代对象
迭代器

1 #迭代器定义: 2 #类中得有__iter__和__next__两个方法 3 #__iter__方法放回对象本身,即:self(是迭代器对象) 4 #__next__方法,返回下一个数据,若是没有了,要抛出一个 StopIteration异常 5 6 class Li(object): 7 def __init__(self): 8 self.counter=0 9 10 def __iter__(self): 11 return self 12 def __next__(self): 13 self.counter += 1 14 if self.counter==5: 15 raise StopIteration() 16 return self.counter 17 obj1=Li() 18 19 #测试返回迭代器对象本身,可以循环 20 #结果为:1 2 3 4 21 v1=obj1.__iter__() 22 for item in v1: #这里v1换成obj1结果一样 23 print(item) 24 #for循环首先执行迭代器对象的__iter__方法,获取到其返回值(self) 25 #然后for循环反复执行其__next__方法,每执行一次就赋值给item 26 #for循环依赖于迭代器 27 28 29 30 #测试obj1.__next__(),写几个执行几次,直到报错 31 #与obj1.__next__()等同的是自带的next(obj1) 32 33 print(dir(v1)) #dir查其方法
生成器

1 #生成器(特殊的迭代器) 2 #编写方式和表现形式不同罢了 3 def func(): 4 yield 1 5 yield [1, 2, 3, 4, ] 6 yield {'name':'Kant','age':18} 7 #创建生成器对象(内部是根据生成器类generator创造出对象),其内部也有__iter__和__next__两个方法 8 obj=func() #生成器对象 9 10 #print(next(obj)) 11 for i in obj: 12 print(i) #生成上面完全一样的东西 13 #也是基于迭代器去取值 14 print(dir(obj))
可迭代对象

1 #如果一个类中有__iter__方法且返回一个迭代器对象;则我们称这个类创建的对象为可迭代对象 2 #列表 字典 都是可迭代对象 3 4 # 5 class Li(object): 6 def __init__(self): 7 self.counter = 0 8 9 def __iter__(self): 10 return self 11 12 def __next__(self): 13 self.counter += 1 14 if self.counter == 5: 15 raise StopIteration() 16 return self.counter 17 18 19 20 21 class Foo(object): 22 def __iter__(self): 23 obj=Li() 24 return obj #return一个迭代器对象obj 25 #也可以直接写成return Li() 26 27 obj=Foo() # 创建可迭代对象obj(有__iter__方法,无__next__方法) 28 print(dir(obj)) 29 for i in obj: 30 print(i) 31 #循环可迭代对象的时候,内部先执行obj.__iter__并且获取迭代器对象 32 #然后不断循环迭代器对象的__next__方法 33 34 #判断是可迭代对象还是迭代器 35 from collections.abc import Iterator,Iterable 36 #Iterator迭代器(有__iter__和__next__两个方法) 37 #Iterable是否可迭代(有__iter__并且返回一个迭代器对象) 38 v1=[1,2,3,4,] #为可迭代对象 39 print(isinstance(v1,Iterator)) #False,不是迭代器 40 print(isinstance(v1,Iterable)) #True,可以迭代 41 obj66=Li() #为迭代器对象 42 print(isinstance(obj66,Iterable)) #True,因为它也返回自身(迭代器) 43 44 #判断一个东西是否为可迭代对象 45 def judge(obj): 46 if isinstance(obj,Iterable): 47 if isinstance(obj,Iterator): 48 print('这是一个迭代器对象') 49 else: 50 print('这是一个可迭代对象') 51 else: 52 print('这个对象不可迭代') 53 54 judge(v1) 55 #这是一个可迭代对象
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术