• Python的迭代对象和迭代器


    Python中迭代对象(Iterable)是非常核心的内容, 今天就和大家分享一下, 什么是迭代对象和迭代器
    简单来说迭代就等于循环, 那么迭代对象就是可以用for循环的对象.一句话记忆, 可以直接用于for循环的数据类型, 就是迭代对象.

    常见的可迭代对象包括:

    一、集合数据类型, 如元组(tuple), 列表(list), 字典(dict), 集合(set), 字符串(str)等

    二、生成器generator, 包括生成器和带yield的generator function.

    这些可以直接作用于 for 循环的对象统称为 可迭代对象: Iterable

    可迭代对象的实质: 在语法层面,如果一个对象实现了__iter__函数,那么这个对象就是可迭代对象.

    迭代对象(Iterable)并不是指某种特定的数据类型或数据结构,它是指存储元素的容器对象,且容器中的元素允许使用__iter__( )函数或__getitem__( )函数进行访问

    __iter__函数的作用是让对象可以用for … in循环遍历

    getitem( )方法是让对象可以通过“实例名[index]”的方式访问实例中的元素.

    如何判断数据是否为可迭代对象呢?

    判断时可以使用 isinstance(数据类型, Iterable) 判断一个对象是否是Iterable对象

    from collections import Iterable
    
    print(isinstance('qftest', Iterable)) # True
    
    print(isinstance((),Iterable)) # True
    
    print(isinstance([],Iterable)) # True
    
    print(isinstance({},Iterable)) # True
    
    print(isinstance((x for x in range(6)), Iterable)) # True
    
    print(isinstance(10086, Iterable)) # False
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    通过上面例子可以看出,Python中的内置类型元组(tuple), 列表(list),字典(dict),字符串(str)等对象都是可迭代的.

    接下来, 我用自定义一个类, 看一下类是否为可迭代对象.

    class ListDemo:
    
    def __init__(self):
    
    self.listnum = []
    
    def add(self, n):
    
    self.listnum.append(n)
    
    
    list = ListDemo()
    
    list.add(10)
    
    list.add(20)
    
    print(isinstance(list, Iterable)) # False
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    我们自定义了一个类ListDemo,由于这个类没有实现iter方法,所以这个类的实例不是可迭代对象。

    那么什么是迭代器呢?

    可以被next()函数调用并不断返回下一个值的对象称为迭代器: Iterator.

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

    from collections import Iterator
    
    print(isinstance('qftest', Iterator)) # False
    
    print(isinstance((),Iterator)) # False
    
    print(isinstance([],Iterator)) # False
    
    print(isinstance({},Iterator)) # False
    
    print(isinstance((x for x in range(6)), Iterator)) # True
    
    print(isinstance(10086, Iterator)) # False
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    生成器都是Iterator对象, 但元组(tuple), 列表(list), 字典(dict), 字符串(str)虽然是Iterable, 但却不是Iterator.

    如何将元组(tuple), 列表(list), 字典(dict), 字符串(str)等Iterable转为Iterator呢?

    使用用iter() 函数即可。

    print(isinstance(iter([]),Iterator)) # True
    
    print(isinstance(iter({}),Iterator)) # True
    
    print(isinstance(iter(()),Iterator)) # True
    
    print(isinstance(iter('qftest'),Iterator)) # True
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    大家可能会有疑问, 为什么元组(tuple), 列表(list), 字典(dict), 字符串(str)等数据类型不是 迭代器呢(Iterator), 是迭代对象又不是迭代器,云里雾里的, 我们接着往后看.

    python中的Iterator对象表示的是一个数据流, Iterator对象可以被next()函数调用并不断返回下一个值直到没有数据返回最后抛出StopIteration错误提示。

    可以将该数据流当做一个序列, 但我们不知道该序列的长度, 只能不断通过next() 函数实现按需计算下一个数据.

    所以Iterator的计算是惰性的. 只有在需要返回下一个数据时, 它才会做计算.

    Iterator表示一个无限数量的元素容器.

    凡是可作用于for循环的对象 都是Iterable对象

    凡是可作用域next() 函数的对象都是 Iterator 类型, 它们表示一个惰性计算的序列.

    集合数据类型 list, tuple, dict, str等是Iterable但不是Iterator, 不过可以通过iter() 函数获得一个Iterator对象.

    例如: python中的for循环底层就是通过不断的进行调用next() 函数实现的.

    for i in [10, 20, 30, 40,50]:
    
    print(i)
    
    • 1
    • 2
    • 3

    完全等价于:

    先将列表数据 转换为Iterator迭代器

    i = iter([10,20,30,40,50])
    
    • 1

    再循环

    while True:
    
    try:
    
    # 获取下一个值
    
    x = next(i)
    
    except StopIteration:
    
    # 没有数据 捕获StopIteration异常
    
    break
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    以上就是迭代对象与迭代器的相关内容.

    最后感谢每一个认真阅读我文章的人,下面这个网盘链接也是我费了几天时间整理的非常全面的,希望也能帮助到有需要的你!

    在这里插入图片描述

    这些资料,对于想转行做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助……

    如果你不想一个人野蛮生长,找不到系统的资料,问题得不到帮助,坚持几天便放弃的感受的话,可以点击下方小卡片加入我们群,大家可以一起讨论交流,里面会有各种软件测试资料和技术交流。

    敲字不易,如果此文章对你有帮助的话,点个赞收个藏来个关注,给作者一个鼓励。也方便你下次能够快速查找。

    自学推荐B站视频:

    零基础转行软件测试:38天自学完软件测试,拿到了字节的测试岗offer,堪称B站最好的视频!

    自动化测试进阶:已上岸华为,涨薪20K,2022最适合自学的python自动化测试教程,自己花16800买的,无偿分享

    在这里插入图片描述

  • 相关阅读:
    哈莫尼斯 手工王国 Harmonis the hand made kingdoms,官方中文,解压即玩,
    M系列 Mac使用Homebrew下载配置git和连接GitHub
    C++学习笔记(Ⅲ):C++核心编程
    使用 TiUP 升级 TiDB
    云游戏发行是什么?云游戏发行的演进历程
    结合邻域连接法的蚁群优化(NACO)求解TSP问题(Matlab代码实现)
    玩一下Spring Boot
    只有线上出了bug,老板们才知道测试的价值?
    vsCode之Live Server
    antd树型表格的逐级展开折叠(每次展开都只展开到当前未展开的最小层级,每次折叠都只折叠到当前未折叠的最大层级)
  • 原文地址:https://blog.csdn.net/xfw17397388089/article/details/126319081