关于python中可迭代对象和迭代器的一些理解

关于python中可迭代对象和迭代器的一些理解

很多python教程中,对python的解释不容易理解,本文记录自己的理解和体会,是对迭代器和生成器的初步理解

一、关于迭代的认识

给定一个列表、元祖、字典、甚至字符串,我们使用for去遍历,这样我们叫迭代

  • 1、列表的迭代

    list1 = ['哈哈', '西西', '嘻嘻']
    for x in list1:
        print(x)
    复制代码
  • 2、列表中需要迭代出下标使用enumerate

    list1 = ['哈哈', '西西', '嘻嘻']
    for index, value in enumerate(list1):
        print(index, value)
    复制代码
  • 3、元祖和字符串的迭代与列表的类似,一样的可以使用enumerate进行下标迭代

  • 4、字典的迭代方式一

    dict1 = {
         'name': '张三', 'age': 20, 'gender': '男'}
    for item in dict1:
        print(item)
    复制代码
  • 5、字典的迭代方式二

    dict1 = {
         'name': '张三', 'age': 20, 'gender': '男'}
    for key in dict1.keys():
        print(key)
    复制代码
  • 6、字典的迭代方式三

    dict1 = {
         'name': '张三', 'age': 20, 'gender': '男'}
    for value in dict1.values():
        print(value)
    复制代码
  • 7、字典的迭代方式四

    dict1 = {
         'name': '张三', 'age': 20, 'gender': '男'}
    for k, v in dict1.items():
        print(k, v)
    复制代码

二、可迭代与迭代器的区别

  • 1、可迭代一般都可以使用for来遍历

  • 2、迭代器不仅仅可以使用for遍历还可以使用next()函数一次获取一个元素

  • 3、可迭代转换迭代对象使用iter(可迭代对象)

  • 4、判断可迭代对象与迭代器的方式

    from collections.abc import Iterator, Iterable
    # Iterable 表示可迭代对象
    # Iterator 表示迭代器
    list1 = [1, 2, 3]
    print(isinstance(list1, Iterator))
    print(isinstance(list1, Iterable))
    print(isinstance(iter(list1), Iterator))
    复制代码
  • 5、集合数据类型如listdictstr等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象

三、自己实现一个可迭代的对象

  • 1、方式一(在类中实现__getitem__魔法函数)

    from collections.abc import Iterator, Iterable
    
    
    class Company(object):
        def __init__(self, employee_list):
            self.employee = employee_list
    
        def __getitem__(self, item):
            return self.employee[item]
    
    
    if __name__ == "__main__":
        company = Company(['张三', '李四', '王五'])
        print(isinstance(company, Iterable))
        print(isinstance(company, Iterator))
        print(isinstance(iter(company), Iterator))
        for item in company:
            print(item)
    复制代码
  • 2、方式二(在类中实现__iter__魔法函数,需要结合__next__魔法函数)其实已经是迭代器

    from collections.abc import Iterator, Iterable
    
    
    class Company(object):
        def __init__(self, employee_list):
            self.employee = employee_list
            self.index = 0
    
        def __iter__(self):
            return self
            
        def __next__(self):
            try:
                current_val = self.employee[self.index]
            except IndexError:
                raise StopIteration
            self.index += 1
            return current_val
    
    
    if __name__ == "__main__":
        company = Company(['张三', '李四', '王五'])
        print(isinstance(company, Iterable))
        print(isinstance(company, Iterator))
        for item in company:
            print(item)
    复制代码
  • 3、总结

    • 1.iter内置函数会调用__iter__魔法函数,如果没有__iter__ 魔法函数就会去调用__getitem__魔法函数
    • 通过isinstance(company, Iterable)判断对象是否可迭代
    • 通过isinstance(company, Iterator)判断对象是否为迭代器
    • 可迭代器对象不代表是迭代器,但是可以通过iter()函数将可迭代的转换为迭代器

四、自定义迭代器

  • 1、最简单也是最粗暴的方式,直接在类中实现两个魔法函数__iter____next__函数

    from collections import Iterable, Iterator
    
    
    class Foo(object):
        def __init__(self, start, stop):
            self.start = start
            self.stop = stop
    
        def __iter__(self):
            return self
    
        def __next__(self):
            if self.start > self.stop:
                raise StopIteration
            self.start += 1
            return self.start
    
    
    if __name__ == "__main__":
        foo = Foo(1, 5)
        print(isinstance(foo, Iterable))
        print(isinstance(foo, Iterator))
    复制代码
  • 2、单独定义一个类来继承迭代器,必须实现__next__魔法函数

    from collections.abc import Iterable, Iterator
    
    
    class MyInterator(Iterator):
        """ 定义一个迭代器 """
    
        def __init__(self, employee_list):
            self.iter_list = employee_list
            self.index = 0
    
        def __next__(self):
            try:
                word = self.iter_list[self.index]
            except IndexError:
                raise StopIteration
            self.index += 1
            return word
    复制代码
    class Company(object):
        def __init__(self, employee_list):
            self.employee = employee_list
            self.index = 0
    
        def __iter__(self):
            return MyInterator(self.employee)
    
    
    if __name__ == "__main__":
        company = Company(['张三', '李四', '王五'])
        print(isinstance(company, Iterator))
        print(isinstance(company, Iterable))
    复制代码
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101280.html原文链接:https://javaforall.net

(0)
上一篇 2021年6月17日 下午7:00
下一篇 2021年6月17日 下午8:00


相关推荐

  • POSTMAN自动生成接口文档_django官方文档

    POSTMAN自动生成接口文档_django官方文档介绍drf-spectacular是为DjangoRESTFramework生成合理灵活的OpenAPI3.0模式。它可以自动帮我们提取接口中的信息,从而形成接口文档,而且内容十分详细,再也不

    2022年7月31日
    8
  • edgeR基因表达差异分析

    edgeR基因表达差异分析edgeR 基因表达差异分析文章目录 edgeR 基因表达差异分析官方文档总结读取 read 数 DGEList 对象 构建分组过滤 删除低表达基因 CPM 标度转换手动过滤自动过滤归一化测序深度有效库大小 GC 含量基因长度 MDS 图形展示样本无监督聚类负二项式模型计算生物变异系数计算差异基因广义线性模型 Glm 计算离散度计算 DE 基因如果没有重复样本 输出结果查看统计参考 一个比较详细的例子 http www iwhgao com edger E7 AE 80 E5 8D 95 E4 BD BF E7 94 A8

    2026年3月19日
    3
  • MAC-npm更新版本「建议收藏」

    参考连接:参考连接运行下面的命令,查看npm可更新的版本:npm-goutdated输入一下命令,更新对应的版本:sudonpm-ginstallnpm@4.4.4在这里安装可能会报错:ENOTEMPTY:directorynotempty,rename’/usr/local/lib/node_modules/npm’->’/usr/local/lib/no

    2022年4月18日
    522
  • websocket与tcp区别_websocket对网络要求

    websocket与tcp区别_websocket对网络要求TCP socket和web socket的区别

    2022年4月21日
    96
  • 主定理求解算法时间复杂度

    主定理求解算法时间复杂度主定理所谓主定理 就是用来解递归方程的一种方法 此方法可以用来求解大多数递归方程 设递归方程为 T n aT n b f n nbsp 其中 a 1 b 1 主定理 nbsp nbsp nbsp 1 如果存在常数 0 有 f n O n logb a 则 T n n logb a nbsp nbsp nbsp 2 若 f n n logb a 则 T n n logb a logn

    2026年3月16日
    2
  • ActiveMQ简介与安装

    1.ActiveMQ简介ActiveMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。ActiveMQ使用Apa

    2021年12月28日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号