python 迭代器,生成器,可迭代对象

迭代器
迭代器定义: 当类中定义了__iter__,和__next__ 两个方法
其中 ‘iter’ 返回对象本身,self
next’ 返回下一个数据,如果数据取完了,则抛出一个StopIteration的异常。
这个是我们日常中使用最多的特殊方法。

# 创建迭代器
class Iter_test:
    def __init__(self,count):
        self.count = count
        self.num = 0
    def __iter__(self):
        return  self
    def __next__(self):
        self.num += 1
        if self.num == self.count:
            raise StopIteration
        return self.num
obj = Iter_test(10)
# print(obj.__next__())
# print(obj.__next__())
# print(obj.__next__()) # 当连续输出第10次的时候,报错异常
for i in obj:   # 很range 的输出结果一样,首先执行__iter__方法,获取一个迭代器对象,然后不断的执行next方法,知道有StopIteration异常为止
    print(i)

生成器:生成器是一种特殊的迭代器

def func():  # 一个最简单的生成器
    yield 1
    yield 2

obj = func()

#next(obj)
#next(obj)
for i in obj: # 同样的放回生成器中的__next__方法
    print(i)

这边说一下dir()方法,dir(对象) 可以展示出对象中的所有方法

# dir(类)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'count', 'num']

结合dir的展示,我们可以发现,迭代器对象和迭代器中都包含__iter__ 和 next 方法,所以说,生成器也是一种特殊的迭代器

可迭代对象: 一个类中有__iter__方法,且返回一个迭代器对象。

class Iter_test:
    def __iter__(self):
        return 可迭代对象
obj = Iter_test()  #obj就是可迭代对象
print(dir(obj))

#['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']   里面只有一个__iter__方法,这个方法返回的是迭代器对象。
# obj.__iter__  是一个可迭代器对象

posted @ 2021-11-12 18:02  大葱丁  阅读(36)  评论(0编辑  收藏  举报