zoukankan      html  css  js  c++  java
  • 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__  是一个可迭代器对象
    
    
  • 相关阅读:
    什么是J2EE
    JSE,JEE,JME三者之间有什么区别
    windows下git显示文件被修改,实际没有改动的问题解决办法
    laravel 多个项目共享SESSION
    laravel 共享session问题总结
    laravel5 报错419,form 添加crrf_field 后让然失败,本地环境配置问题
    QQ互联登录提示redirect uri is illegal(100010)完美解决方法
    vim鼠标模式打开与关闭
    HTML5----响应式(自适应)网页设计
    file_put_contents () failed to open stream: Permission denied 解决办法
  • 原文地址:https://www.cnblogs.com/dinghc/p/15545844.html
Copyright © 2011-2022 走看看