迭代器&&生成器&&可迭代对象
迭代器
定义:
1.当类中定义了 __iter__
和 __next__
两个方法。
2. __iter__
方法需要返回对象本身,即:self
3. __next__
方法,返回下一个数据,如果没有数据了(不返回数据了),则需要抛出一个StopIteration的异常。
接下来,通过代码来认识它
class IT(object):
def __init__(self):
self.counter = 0
def __iter__(self):
return self
def __next__(self):
self.counter += 1
if self.counter == 3:
raise StopIteration()
return self.counter
# 根据类实例化创建一个迭代器对象:
obj1 = IT()
v1 = next(obj1) # 相当于 v1 = obj1.__next__()
print(v1)
v2 = next(obj1)
print(v2)
v3 = next(obj1)
print(v3)
obj2 = IT() # 又创建了一个迭代器对象
for item in obj2: # 首先会执行迭代器对象的__iter__方法并获取返回值,一直去反复的执行 next(对象)
print(item)
注意:
1.迭代器对象支持通过next取值,如果取值结束则自动抛出StopIteration。
2.for循环内部在循环时,先执行__iter__方法,获取(返回)一个迭代器对象,然后不断执行的next取值(有异常StopIteration则终止循环)。
生成器
生成器是特殊类型的迭代器,因为它符合迭代器的定义
上代码示例
# 创建生成器函数
def func():
yield 1
yield 2
# 创建生成器对象(内部是根据生成器类generator创建的对象),生成器类的内部也声明了:__iter__、__next__ 方法。
obj1 = func()
for item in obj2:
print(item)
想说的是:如果按照迭代器的规定来看,其实生成器类也是一种特殊的迭代器类(生成器也是一个中特殊的迭代器)。
可迭代对象
定义:如果一个类中有__iter__方法且返回一个迭代器对象 ;则我们称以这个类创建的对象为可迭代对象。
# IT类符合迭代器的规则,所以IT类是迭代器类,创建的对象就是迭代器对象
class IT(object):
def __init__(self):
self.counter = 0
def __iter__(self):
return self
def __next__(self):
self.counter += 1
if self.counter == 3:
raise StopIteration()
return self.counter
# Foo类里面有__iter__方法,返回迭代器对象,所以这个类创建的对象是 可迭代器对象
class Foo(object):
def __iter__(self):
return IT()
obj = Foo() # 可迭代对象
for item in obj: # 循环可迭代对象时,内部先执行obj.__iter__并获取迭代器对象;不断地执行迭代器对象的next方法。
print(item)
常见的数据类型:列表,字典,元组,集合都是可迭代对象
from collections.abc import Iterator, Iterable
# Iterator -> 迭代器
# Iterable -> 可迭代对象
v1 = [11, 22, 33] # 列表 —> 可迭代对象
print( isinstance(v1, Iterator) ) # false,判断是否是迭代器;判断依据是__iter__ 和 __next__。
print( isinstance(v1, Iterable) ) # True, 判断是否是可迭代对象,判断依据是是否有 __iter__且返回迭代器对象。
v2 = v1.__iter__() # 返回迭代器对象
print( isinstance(v1, Iterator) ) # True
print( isinstance(v2, Iterable) ) # false
如何查看是可迭代对象还是迭代器
- 有
__iter__
和__next__
就是迭代器或者生成器 - 只有
__iter__
就是可迭代对象 - 通过dir(生成的变量) 可以查看到类中所有的成员
eg: v1 = [11, 22, 33] print(dir(v1)) # ['__iter__',..........]
以上就是对迭代器,生成器和可迭代对象的认识!