有关迭代器、迭代器对象、生成器、可迭代对象的知识点的学习总结
目录
- 1. 迭代器
- 1.1迭代器
 - 1.2 迭代器对象
- 1. __next__方法
 - 2. for循环
 
 
 - 2. 生成器
 - 3. 可迭代对象
 - 4. 补充知识点
- 4.1 自定义一个range
- 4.1.1 基于可迭代对象实现
 - 4.1.2 基于生成器实现
 
 - 4.2 是可迭代对象的常见数据类型
 - 4.3 python中判断类型
 
 - 5.几段应用知识点的代码
- 5.1 例1
 
 
1. 迭代器
1.1迭代器
- 类中定义了
__iter__、__next__两个方法 
__iter__方法返回self 
__next__方法返回下一个数据,如果没有数据了,则需要抛出一个StopIteration的异常 
1 2 3 4 5 6 7 8 9 10 11 12
   | class Exa:     def __init__(self):         self.counter = 0              def __iter__(self):         return self          def __next__(self):         self.counter += 1         if self.counter == 5:             raise StopIteration()         return self.counter
   | 
 
1.2 迭代器对象
迭代器对象就是对迭代器的实例化
1. __next__方法
可以通过反复执行__next__方法获取其中的值,有两种调用方式:
1 2 3
   | obj1 = Exa() v1 = obj1.__next__() v1 = next(obj1)   
   | 
 
其中,Exa是迭代器的类名,obj1是对迭代器实例化的对象
2. for循环
可以对迭代器对象进行for循环
1 2 3
   | obj2 = Exa() for o in obj2:     print(o)
   | 
 
过程:
① 首先会执行迭代器对象中的__iter__方法并获取返回值(返回self)
②然后会反复执行next(obj2)
③直到没有数据了,抛出异常
2. 生成器
定义一个函数,函数中只要有yield,这个函数就被称为生成器函数。
1 2 3
   | def func():     a = [0, 1, 2, 3, 4]     yield a 
   | 
 
生成器函数()  :就是生成器对象(内部是根据生成器类generator创建的对象)。
生成器类的内部也声明了:
方法。
如果按照迭代器的定义来看,生成器也可以认为是一种特殊的迭代器
且生成器可以使用next方法,可以进行for循环
3. 可迭代对象
如果一个类中有__iter__方法且返回一个迭代器对象 ,则我们称以这个类创建的对象为可迭代对象。
1 2 3 4 5 6 7 8 9 10
   | class Foo(object):
  	def __iter__(self): 		return 迭代器对象(生成器对象) 		 obj = Foo()   
 
  for item in obj: 	pass
   | 
 
1 2
   | v1 = range(100)   dir(v1)  
   | 
 
列表、元组、字典、集合常见的数据类型全是可迭代对象
4. 补充知识点
4.1 自定义一个range
4.1.1 基于可迭代对象实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
   | class IterRange(object):        def __init__(self, num):         self.num = num         self.counter = -1              def __iter__(self):         return self          def __next__(self):         self.counter += 1         if self.counter == self.num:             raise StopIteration()         return self.counter     
  class Irange(object):        def __init__(self, max_num):         self.max_num = max_num              def __iter__(self):         return IterRange(self.max_num)          
  for i in Irange(10):     print(i)     
 
  0 1 2 3 4 5 6 7 8 9
   | 
 
4.1.2 基于生成器实现
1 2 3 4 5 6 7 8 9 10 11 12
   | class Irange(object):     def __init__(self, max_num):         self.max_num = max_num          def __iter__(self):         counter = 0         while counter < self.max_num:             yield counter             counter += 1      for i in Irange(10):     print(i)
   | 
 
4.2 是可迭代对象的常见数据类型
1 2 3
   | v1 = list([1, 2, 3, 4])
  dir(v1) 
   | 
 
列表、元组、字典、集合常见的数据类型全是可迭代对象
4.3 python中判断类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14
   | from collections.abc import Iterator, Iterable
 
 
 
  v1 = [1, 2, 3, 4] print(isinstance(v1, Iterable))   print(isinstance(v1, Iterator))  
 
  v2 = v1.__iter__() print(isinstance(v2, Iterable))   print(isinstance(v2, Iterator))  
 
   | 
 
iterable:返回的可能是可迭代对象,也可能是迭代器对象
iterator:返回的是迭代器对象
5.几段应用知识点的代码
结合例子加深理解
5.1 例1
1 2 3 4 5 6 7 8 9 10
   | def test():     for i in range(4):         yield i           g = test() g1 = (i for i in g) g2 = (i for i in g1) g3 = (i for i in list(g1)) print(list(g1)) print(list(g2))
   | 
 
庖丁解牛: