关于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))
    复制代码
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 【c#】控制台程序编写计时器「建议收藏」

    【c#】控制台程序编写计时器「建议收藏」【c#】控制台程序编写计时器

  • vb教程编程实例详解pdf_vb程序设计教程答案刘炳文

    vb教程编程实例详解pdf_vb程序设计教程答案刘炳文实验8-1编写如图2.8.1所示的应用程度。若单击“建立文件”按钮,则分别用Print#和和Write#语句将三个同学的学号、姓名和成绩写入Score.dat和Score1.dat;若单击“读取文件”按钮,则用lineInput语句按行将两个(当前目录)文件中的数据显示在相应的文本框。其中:学号和姓名是字符串类型,成绩是整型。解题,画2个按钮,2个文本框(2个文本框的MultiLin…

  • pac模式与全局模式哪个好_ppp模式的优缺点

    pac模式与全局模式哪个好_ppp模式的优缺点众所周知,传统有一大弊端,即:只能使用全局模式,这样情况下,虽然可以加速国外网站,但打开国内网站速度会变慢;加速度不但支持全局模式,同时也支持PAC模式(智能分流,绕过中国大陆),这样情况下,既可以加速国外网站,也不会影响国内网站打开速度!温馨提示:安卓手机客户端、IOS客户端、MAC客户端均可根据自己实际使用需求,自由切换【PAC模式】或者【全局模式】,具体如何切换可查看相应客户端设置教程;…

    2022年10月19日
  • XMLElement,XMLDocument 用法「建议收藏」

    XMLElement,XMLDocument 用法「建议收藏」来源http://www.cr173.com/html/23515_1.html一前言先来了解下操作XML所涉及到的几个类及之间的关系 如果大家发现少写了一些常用的方法,麻烦在评论中指出,我一定会补上的!谢谢大家*1XMLElement主要是针对节点的一些属性进行操作*2XMLDocument主要是针对节点的CUID操作*3XMLNode为抽象

  • arm汇编指令详解带实例_汇编buf指令

    arm汇编指令详解带实例_汇编buf指令ARM的编程模式和七种模式基本设定架构(32位)约定Byte(字节):8bitsHalfword(半字):16bits(2byte)Word(字):32bits(4byte)指令集ARM指令集(32-bit)Thumb指令集(16-bit)Thunmb指令集(16&32bit)不考虑工作模式种类:七种非特权模式(Normal:普通模式)User(用户模式):非特权模式,大部分时候在这个模式下工作特权模式(Privilege:特

    2022年10月14日
  • 学员管理系统(完整版)

    前言:学员管理系统是刚接触python时算是一个比较难的小项目,毕竟第一次接触这样的思维逻辑,不过用心学起来还是很有趣的,发现乐在其中,也就不觉得难了。下面给大家分享一下学员管理系统较为完整的代码(当然其中肯定有很多不足,毕竟是新手,菜鸟小程序猿,还请见谅!多谢!)言归正传:学员管理拆分为一下步骤:首先:先定义存储所有学员信息的大列表students=[]添加学员,代码如下:查…

发表回复

您的电子邮箱地址不会被公开。

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