• 『无为则无心』Python基础 — 61、Python中的迭代器


    1、迭代的概念

    (1)什么是迭代

    迭代就是单向地、逐个地访问某个容器中的元素的行为。 简单说迭代就是循环。

    (2)迭代和遍历的区别

    迭代是遍历的一种特例,遍历(traverse)是可以在数据结构上来回的游走,不仅可以往前,还可以往后,同时还能保证不重不漏的,迭代是单向的,逐个的,而且只来一次。

    2、迭代器的概念

    (1)概念

    在Python中常见的序列有listtuplesetdictstr,我们也称之为容器。

    我们之前在遍历这些容器的时候,针对不同的容器,每次写的代码还都有所差别。于是我们想能不能写一个工具,当我们需要对一个容器中的元素,进行单向的,一个接一个的取出来的时候,就调用这个工具。

    这个工具可以帮我们把不同容器遍历细节上的不同屏蔽掉,当我们需要这个操作的时候,就把容器直接传给这个工具就好了,而这个工具就叫迭代器。

    (2)优点

    • 从序列类型中一个一个的取值,会把所有的值都取到。
    • 节省内存空间,迭代器并不会在内存中占用一大块内存,面是随着循环每次生成一个,每调用一次next方法就会返回给我一个元素。

    3、可迭代的对象(Iterable)

    (1)什么是可迭代的对象

    简单的说,一个对象只要实现了只要实现了__iter__()方法,就是一个可迭代的对象。

    可以使用isinstance()判断一个对象是否是Iterable对象:

    (2)Python中常见的可迭代数据类型

    1. 集合或序列类型(如listtuplesetdictstr
    2. 文件对象(以后扩展)
    3. 在类中定义了__iter__()方法的对象,可以被认为是 Iterable对象,

    示例:

    python
    from collections.abc import Iterable
    
    print(isinstance('', Iterable))  # true 字符串是可迭代的
    print(isinstance([], Iterable))  # true 列表是可迭代的
    print(isinstance((), Iterable))  # true 元组是可迭代的
    print(isinstance({}, Iterable))  # true 字典是可迭代的
    print(isinstance(set(), Iterable))  # true 集合是可迭代的

    说明:

    这些内置集合或序列对象都有__iter__方法,即他们都实现了同名方法。

    我们可以随便定义一个序列,如下:

    python
    testList = list()

    在PyCharm中按住ctrl键点击list()就可以查看list类的源码。

    源码中我们就能够看到list类中定义了__iter__函数。

    其他的可迭代序列同理。

    像int数据类型,按住ctrl键点击查看。int类中并没有定义__iter__函数。

    highlighter- basic
    1 = int()

    4、迭代器对象(Iterator)

    序列类型(如listtuplesetdictstr等)都是可迭代对象,但是他们并不是迭代器对象。

    可以使用iter()函数把可迭代对象(Iterable)变成迭代器对象(Iterator):

    验证:

    python
    from collections.abc import Iterable, Iterator
    
    print(isinstance('', Iterator))  # False 字符串不是迭代器对象
    print(isinstance([], Iterator))  # False 列表不是迭代器对象
    print(isinstance((), Iterator))  # False 元组不是迭代器对象
    print(isinstance({}, Iterator))  # False 字典是不是迭代器对象
    print(isinstance(set(), Iterator))  # False 集合不是迭代器对象
    
    
    
    # iter()可把对应的可迭代对象转换成迭代器对象
    print(isinstance(iter(""), Iterator))  # True 迭代器对象
    print(isinstance(iter([]), Iterator))  # True 迭代器对象
    print(isinstance(iter(()), Iterator))  # True 迭代器对象
    print(isinstance(iter({}), Iterator))  # True 迭代器对象
    print(isinstance(iter(set()), Iterator))  # True 迭代器对象
    

    说明:

    可迭代对象支持内置函数iter,通过对可迭代对象调用iter函数,会返回一个迭代器。而“迭代器”支持内置函数next(),通过不断对其调用next()方法,会依次前进到序列中的下一个元素并将其返回,最后到达序列的末尾时,会引发StopIteration异常。

    补充说明一点,对迭代器调用iter方法,则会返回迭代器自身。

    示例如下:

    python
    # 定义一个列表
    testList = [1, 2, 3, 4]
    
    # 把列表转变成一个迭代器对象
    it = iter(testList)
    
    # 迭代器对象调用__iter__,返回迭代器对象本身
    # 
    print(it.__iter__())

    5、迭代器的使用体验

    (1)基本用法

    python
    # 定义一个列表
    testList = [1, 2, 3, 4]
    
    # 把列表转变成一个迭代器对象
    it = iter(testList)
    
    # 使用迭代器
    # 从迭代器中取出一个接着一个的元素
    print(next(it))  # 1
    print(next(it))  # 2
    print(next(it))  # 3
    print(next(it))  # 4
    # 当迭代完存储的所有元素之后,如果继续迭代,
    # # 则 __next__() 方法会抛出 StopIteration 异常。
    print(next(it))  # StopIterable 异常

    (2)实际应用

    python
    # 示例1
    # 用迭代器来访问列表中的元素
    # 定义一个列表
    testList = [1, 2, 3, 4]
    
    # 把裂变转变成一个迭代器对象
    it = iter(testList)
    
    # 使用迭代器取值
    while True:
        try:
            # 调用next函数,获取下一个字符
            result = next(it)
            print(result)
        except StopIteration:
            # 释放对it的引用,即废弃迭代器对象
            del it
            # 不推出循环会成为私循环
            break
    
    
    # 示例2
    # 用迭代器来访问列表中的元素
    # 定义一个字符串
    testStr = "Python"
    
    # 把裂变转变成一个迭代器对象
    it = iter(testStr)
    
    # 使用迭代器取值
    for str in it:
        print(str)

    参考:


    __EOF__

  • 本文作者: 繁华似锦的博客
  • 本文链接: https://www.cnblogs.com/liuyuelinfighting/p/15953695.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    分布式系统设计策略
    Python Web框架的三强之争:Flask、Django和FastAPI
    k8s 污点和容忍
    Blob 对象 下载文件时 type 类型 大全,及下载方法封装
    Javascript命令模式
    【CTFHUB】SSRF绕过方法之靶场实践(二)
    AndroidStudio003--Button组件的使用,监听及事件处理
    开源镜像站
    基于JAVA SpringBoot和Vue小说在线听书网站设计
    Hive学习笔记:04 SQL的窗口函数、OVER的使用
  • 原文地址:https://www.cnblogs.com/liuyuelinfighting/p/15953695.html