关于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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 电商新宠—广告电商,转化产品的流量聚体地「建议收藏」

    电商新宠—广告电商,转化产品的流量聚体地「建议收藏」现在市面上通过看广告赚点零花钱的项目也是片地一把抓,在各大平台看广告,间接给平台赚钱,却不能给自己带来一些好处;而真正的并没有让消费者能长期的去坚持去做,一个月下来看广告收益也就十多二十元块钱,使大多数平台变得暗淡下去,最后无人问津。目前又听说在市面上流传了一个很火热的广告变现模式——广告电商,结合了“社交电商+广告分佣”,通过在平台购买商品,赠送同等或者一定量的积分,达到不同的门槛,可以根据不同的积分门槛看不同的广告(每天3分钟),实现广告变现,提现到微信、支付宝和对接的第三方支付服务平台。最终实现广告主

    2022年6月22日
    36
  • VMware虚拟机开启导致宿主机蓝屏

    VMware虚拟机开启导致宿主机蓝屏开启虚拟机的虚拟化后,运行VMware中虚拟机导致win10蓝屏备注;win10家庭中文版20H2+VMware16.0由于需要开启虚拟化功能,运行VMware中的eve虚拟机。且eve虚拟机也要开启虚拟化才能运行qemu镜像。1.但是开启eve的虚拟化后,虚拟机无法打开,解决方案:1.cmd管理员身份打开,输入Msinfo32,查看是否关闭基于虚拟化的安全性。如果未关闭输入bcdeditset/hypervisorlaunchtypeoff,然后重启。下面在控制面板取消勾选

    2022年8月21日
    17
  • Redis集合类型

    Redis集合类型

    2022年4月2日
    40
  • 数据结构与算法学习笔记

    本文是王争老师的《算法与数据结构之美》的学习笔记,详细内容请看王争的专栏。有不懂的地方指出来,我做修改。数据结构与算法思维导图数据结构指的是“一组数据的存储结构”,算法指的是“操作数据的一组方法”。数据结构是为算法服务的,算法是要作用再特定的数据结构上的。最常用的数据结构预算法:数据结构:数组、链表、栈、队列、散列表、二叉树‘、堆、跳表、图、Tire树 算法:递归…

    2022年4月7日
    213
  • java 正则表达式 替换 html,java 正则表达式 替换 html「建议收藏」

    java 正则表达式 替换 html,java 正则表达式 替换 html「建议收藏」java正则表达式替换html[2021-01-2922:37:07]简介:java正则表达式用法:1、使用Pattern类进行字符串的拆分,使用的方法是【String[]split(CharSequenceinput)】;2、使用Matcher类进行字符串的验证和替换。相关免费学习推荐:javaphp正则表达式替换图片地址的方法:首先PHP正则提取图片img标记中的任意属性;然后…

    2022年5月16日
    46
  • Linux搭建 Minecraft 服务器

    Linux搭建 Minecraft 服务器本篇文章介绍使用常规方式和docker容器方式在linux操作系统上搭建最新版本的minecraft服务器,并使用bungeecord配置为群组服务器模式。

    2022年6月18日
    40

发表回复

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

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