码迷,mamicode.com
首页 > 其他好文 > 详细

迭代器&生成器

时间:2021-03-03 12:20:19      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:ble   turn   ping   code   raise   imp   start   else   name   

1、迭代器:

可迭代对象 

#  如何判断一个对象是不是可迭代对象
# 方法一:isinstance(obj,Iterable)
# 方法二:看有没有__iter__方法

迭代器协议:

#1、迭代器类型必须包含 __iter__和__next__
#2、__iter__方法必须返回 self
#3、__next__必须返回下一个值,没有则抛出 StopIterator 异常
#4、对迭代器执行for循环 每次都会执行__next__方法
#5、迭代器只能迭代一次 不能重复 迭代中每次都是一个新的数据 占用内存少
#6、for语句会忽略StopIterator异常
class Next():
    def __init__(self,stop,start=0):
        self.start = 0
        self.stop = stop

    def __iter__(self):
        return  self

    def __next__(self):
        """
        返回下一个数
        :return: 如果有返回下一个数,没有就抛出 StopIteration异常
        """
        if self.start>=self.stop-1:
            raise StopIteration
        else:
            self.start += 1
            return self.start


if __name__ == ‘__main__‘:
    obj = Next(5)
    for i in obj:
        print(i)

    # print(obj.__next__())
    # print(obj.__next__())
    # print(obj.__next__())
    # print(obj.__next__())
    # print(obj.__next__())

  

如何判断:

#1、过isinstance(obj,Iterator)
#2、看对象有没有 __iter__属性 __next__属性
from  typing import Iterator
obj = iter(range(1,2))
print(isinstance([1,2,3],list))      #True
print(isinstance(obj,Iterator))      #True
print(isinstance([1,2,3],Iterator))  #False

"""
list和 可迭代对象区别
"""
# for attr in dir(list):
#     print(attr)   #__next__

for attr in dir(obj):
    print(attr)   #__next__    还有__iter__

生成器

为了快速方便创建一个迭代器

yield 实现快速创建迭代器

一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己的内置的__iter__方法),所以生成器就是可迭代对象

 

迭代器&生成器

标签:ble   turn   ping   code   raise   imp   start   else   name   

原文地址:https://www.cnblogs.com/XXQQ123/p/14471977.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!