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

栏目: Python · 发布时间: 5年前

内容简介:很多给定一个列表、元祖、字典、甚至字符串,我们使用

很多 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() 函数将可迭代的转换为迭代器

以上所述就是小编给大家介绍的《关于python中可迭代对象和迭代器的一些理解》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C++沉思录

C++沉思录

Andrew Koenig、Barbara Moo / 黄晓春、孟岩(审校) / 人民邮电出版社 / 2002-11-01 / 50.00元

《C++ 沉思录》集中反映了C++的关键思想和编程技术,不仅告诉你如何编程,还告诉你为什么要这样编程。本书曾出现在众多的C++专家推荐书目中。 这将是C++程序员的必读之作。因为: 它包含了丰富的C++思想和技术,从详细的代码实例总结出程序设计的原则和方法。 不仅教你如何遵循规则,还教你如何思考C++编程。 既包括面向对象编程也包括泛型编程。 探究STL这一近年来C++最重要的新成果的内在思想。一起来看看 《C++沉思录》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

随机密码生成器
随机密码生成器

多种字符组合密码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码