生成器和迭代器,可迭代对象
1. 迭代器
迭代器的实现
'''
迭代器
'''
# 这就是迭代器类型
class IT(object):
def __init__(self):
self.count = 0
def __iter__(self):
return self
def __next__(self):
self.count += 1
if self.count == 3:
raise StopIteration()
return self.count
# 创建一个迭代器对象
# obj1 = IT()
# v1 = obj1.__next__()
# print(v1)
# v2 = obj1.__next__()
# print(v2)
# v3 = obj1.__next__()
# print(v3)
obj2 = IT()
for item in obj2: # 首先会执行迭代器对象的_iter_方法并获取返回值,一直去反复的执行next对象
print(item)
迭代器对象支持通过next取值,如果取值结束则自动抛出StopIteration
for循环内部再循环时,先执行_iter_方法,获取一个迭代器对象,然后不断执行的next取值(有异常StopIteration则终止循环)
2.生成器
#创建生成器函数
def func():
yield 1
yield 2
#创建生成器对象(内部时根据生成器类generator创建的对象),生成器类的内部也声明了:__iter__,__next__方法
obj1 = func()
v1 = obj1.__next__()
print(v1)
v2 = obj1.__next__()
print(v2)
v3 = obj1.__next__()
print(v3)
# 如果按照迭代器的规定来看,其实生成器类也是一种迭代器类-即生成器时特殊的迭代器
obj2 = func()
for item in obj2:
print(item)
创建生成器对象(内部时根据生成器类generator创建的对象),生成器类的内部也声明了
__iter__,__next__
方法
如果按照迭代器的规定来看,其实生成器类也是一种迭代器类-即生成器时特殊的迭代器
3. 可迭代对象
常见的可迭代对象:列表,字典,集合,
# ''',
# 可迭代对象
# '''
# 如果一个类中有__iter__方法且返回一个迭代器对象,则我们称为这个类创建的对象为可迭代对象
class IT(object):
def __init__(self):
self.count = 0
def __iter__(self):
return self
def __next__(self):
self.count += 1
if self.count == 3:
raise StopIteration()
return self.count
class Foo(object):
def __iter__(self):
return IT()
obj = Foo() # 可迭代对象
# # 可迭代对象是可以使用for来进行循环,在循环的内部其实是执行__iter__方法,获取其迭代对象,然后再在其内部执行这个迭代器对象的next功能,逐步取值
for item in obj:
print(item)
-
如何判断是否为可迭代对象或者是否可迭代?
from collections.abc import Iterator,Iterable v1 = [1,2,3] print(isinstance(v1,Iterator)) # flase 判断是否是迭代器,判断依据是__iter__和 __next__ print(isinstance(v1,Iterable)) # True 判断是否可迭代,判断依据是是否有__iter__且返回迭代器对象 v2 = v1.__iter__() print(isinstance(v2,Iterator)) # True 判断是否是迭代器,判断依据是__iter__和 __next__ print(isinstance(v2,Iterable)) # True 判断是否可迭代,判断依据是是否有__iter__且返回迭代器对象