• 快速理解python中的可迭代对象、迭代器、生成器


    快速学会python中的可迭代对象、迭代器、生成器

    今天周一,又要开始新的一周的学习了,加油鸭!多学一点不吃亏哈哈

    迭代

    什么是迭代?迭代就是将重复的代码进行执行,处理相似的数据集。并且上一个迭代的结果会给到下一次,作为初始化值进行下一次的迭代。如果途中有停止,都不能算作是一次迭代。那么迭代器就是驱动这件事的人,迭代器负责把对象一个一个拿出来。

    可迭代对象

    定义:可迭代对象必须实现 “iter()” 方法,可返回迭代对象
    我们所学过的容器均是可迭代对象,例如:字符串、列表、元组、字典、集合、文件对象等都是可迭代对象。

    #迭代对象
    list1=[1,3,4,5,7]
    #迭代过程
    for i in list1:
        print(i)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    迭代原理(面试)一共三步:
    1、for 循环的原理
    2、可以被for的条件是什么?容器为啥可以被for?
    答:
    1、获取迭代器
    2、循环获取下一个元素
    3、遇到异常停止迭代

    迭代器是什么?

    Python的迭代器协议要求实现__iter__方法,__iter__方法会返回一个迭代器对象,这个迭代器对象实现了__next__方法,并且通过抛出StopIteration异常标识迭代的完成

    迭代器实现

    #1、获取迭代器
    iter=list1.__iter__()
    while True:
        #获取下一个元素
        next=iter.__next__()
        print(next)
    结果会抛异常
        next=iter.__next__()
    StopIteration
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    将异常捕获

    #迭代对象
    list1=[1,3,4,5,7]
    #迭代过程
    # for i in list1:
    #     print(i)
    
    #1、获取迭代器
    iter=list1.__iter__()
    while True:
        try:
            #获取下一个元素
            next=iter.__next__()
            print(next)
        except StopIteration:
            break
    以上是迭代的原理
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    for循环原理:
    为什么要用for:因为需要去触发、调用迭代器。字符串 、字典、列表在for循环的作用下,会生成迭代器,然后被使用。
    原理:用 _iter_方法,返回自身self,也就是返回迭代器。不断地调用迭代器的next()方法,每次按序返回迭代器中的一个值。迭代到最后没有元素时,就抛出异常 StopIteration

    #迭代器
    class Skill:
        pass
    class SkillIterator:
        def __int__(self,target):
            self.__target=target
            self.__index=0
        def __next__(self):
            #判断如果没有数据就抛异常,停止迭代器
            if self.__index>len(self.__target)-1:
                raise StopIteration
            #返回下一个数据
            temp=self.__target[self.__index]
            self.__index+=1
            return temp
    
    class SillManager:
    
        def __int__(self):
            self.__skill=[]
        def add_skill(self,skill):
            self.__skill.append(skill)
        def __iter__(self):
            #创建一个迭代器
            return SkillIterator(self.__skill)
    
    s=SillManager()
    s.add_skill(Skill())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    实际上,在迭代器协议中,__next__在哪里定义并不重要,重要的是__iter__要返回带有__next__方法的对象。

    所以从实用的角度出发,我们可以将__next__方法和__iter__方法实现在同一个类里面,像下面这样

    class MyIterator(object):
        def __iter__(self):
            return self
        
        def __next__(self):
            return "hello world"
    
    
    for i in MyIterator():
        print(i)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    现在,因为MyIterator实现了__iter__方法,所以它是可迭代的,同时因为它还实现了__next__方法,所以它又是一个迭代器。
    因为这个类实现了__next__方法,所以在__iter__方法中返回实例自身,就满足了迭代器协议。

  • 相关阅读:
    简单工厂模式
    ROS2时间同步(python)
    SpringCloud - 流量控制(一):基于RequestRateLimiterGatewayFilterFactory的限流
    44 二叉搜索树中第K个小的元素
    数据分析 | Pandas 200道练习题,每日10道题,学完必成大神(7)
    STM32F4X RNG随机数发生器
    23种设计模式
    ShardingSphere-proxy-5.0.0分布式哈希取模分片实现(四)
    docker中DVWA的安装
    QT-day1
  • 原文地址:https://blog.csdn.net/ping233/article/details/126341796