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__  是一个可迭代器对象
    
    
  • 相关阅读:
    常用标点符号的英文名称
    2018年阅读随笔记录(持续更新)
    Lookahead and Lookbehind in Regex
    My Answer in Regex Golf
    Words to Use Instead of "Very"
    区块链
    EntityFramework Core 学习系列(一)Creating Model
    推送本地项目至Github遇到的问题以及解决办法记录
    TF-IDF In Scikit-Learn
    译MassTransit 创建消息消费者
  • 原文地址:https://www.cnblogs.com/dinghc/p/15545844.html
Copyright © 2011-2022 走看看