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查其方法
View Code
复制代码

生成器

复制代码
 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))
View Code
复制代码

可迭代对象

复制代码
 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 #这是一个可迭代对象
View Code
复制代码

 

posted @   磕伴  阅读(25)  评论(0编辑  收藏  举报
编辑推荐:
· 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应用必不可少的技术
点击右上角即可分享
微信分享提示