可迭代对象 python_列表是可迭代对象吗

可迭代对象 python_列表是可迭代对象吗引出问题:​如下面所示,存在一个类,并且产生了一个对象,现在想用for循环实现对象的迭代,结果报错了点击(此处)折叠或打开– coding: utf-8 –“””演示一个类是不可以迭代的结果存在报错信息 说明 A对象不是一个可以迭代的对象for i in A:TypeError: ‘Students’ object is not iterable“””class Students():def init(self):self.names = list()def add(self,

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

引出问题:
​如下面所示,存在一个类,并且产生了一个对象,现在想用for循环实现对象的迭代,结果报错了

# -*- coding: utf-8 -*-

""" 演示一个类是不可以迭代的 结果存在报错信息 说明 A对象不是一个可以迭代的对象 for i in A: TypeError: 'Students' object is not iterable """

class Students():
    def __init__(self):
        self.names = list()

    def add(self, name):
        self.names.append(name)

    def show(self):
        print(self.names)




if __name__ == "__main__":
    A = Students()
    A.add("Bob")
    A.add("Tom")
    A.add("Joe")
    A.add("Coe")

    for i in A:
        print(i)

    A.show()在这里插入代码片

错误原因:

在这    for i in A:
TypeError: 'Students' object is not iterable

Process finished with exit code 1
里插入代码片

​说明对象是不可以进行迭代的,那么如何实现对象的可以迭代呢
​迭代的思路逻辑

# -*- coding: utf-8 -*-
from time import sleep
""" 如下为迭代的学习思路梳理: 后面是具体的代码实现,没有把每一个步骤都进行截图和代码分享,望谅解 (1)一个类中加入__iter__f (self) 方法后变成可迭代的 并返回如下的错误,说明是类型不正确,但是已经能够发生迭代了 for i in A: TypeError: iter() returned non-iterator of type 'NoneType' (2)在此基础上增加一个新的类 class Stuends_iter(): 并同时含有__iter__()和__next__()方法 (3)在class Students():的__iter__()方法中返回一个对象 结果为 None ,并且 None是无限的循环下去,说明已经变成了可以进行迭代的,只是返回值不正确而已 (4)在(3)的基础上加上一个正确的返回值,做如下的修改 def __next__(self): return "zhangsan" 得到的结果为不是None,而是变成了zhangsan ,说明迭代的基础已经能够实现了,但是仍是无限循环的, (5)需要停止循环的话,就需要确定长度,如何确定长度呢? 采用类之间的传参 def __iter__(self): return Stuends_iter(self) def __next__(self): # len_name = len(self.obj.nam) return self.obj.names[0] 传参的结果如下,已经能够成功打印列表中的第一个值 (6) 获取所有传递的列表的长度 len_name = len(self.obj.names) #获得了长度就可以用循环遍历了 (7)完成循环遍历,并且判断长度,存在问题,遍历结束后,仍没有退出 def __next__(self): all_len = len(self.obj.names) if self.nums < all_len: ret = self.obj.names[self.nums] self.nums += 1 return ret (8)需要想办法,让循环结束 解决方法:加else抛出异常情况 def __next__(self): all_len = len(self.obj.names) if self.nums < all_len: ret = self.obj.names[self.nums] self.nums += 1 return ret else: raise StopIteration (9)通过以上办法就实现了对象的迭代 """

class Students():
    def __init__(self):
        self.names = list()

    def add(self, name):
        self.names.append(name)

    def show(self):
        print(self.names)

    def get_lst(self):
        return len(self.names)

    def __iter__(self):
        return Stuends_iter(self)


class Stuends_iter():

    def __init__(self, obj):
        self.obj = obj
        self.nums = 0

    def __iter__(self):
        pass

    def __next__(self):
        all_len = len(self.obj.names)
        if self.nums < all_len:
            ret = self.obj.names[self.nums]
            self.nums += 1
            return ret
        else:
            raise StopIteration




if __name__ == "__main__":
    A = Students()
    A.add("Bob")
    A.add("Tom")
    A.add("Joe")
    A.add("Coe")

    A.add("Bob2")
    A.add("Tom2")
    A.add("Joe2")
    A.add("Coe2")

    for i in A:
        print(i)这里插入代码片

具体的每一个步骤都写在了上面,通过2个类的方法,实现了对象的可以迭代性
​得到的结果:

在Bob
Tom
Joe
Coe
Bob2
Tom2
Joe2
Coe2

Process finished with exit code 0这里插入代码片

​改进逻辑
能不能用一个类就实现迭代呢,答案是可以的
请继续往下看:

# -*- coding: utf-8 -*-
from time import sleep
""" 如下为迭代的学习思路梳理: (1)一个类中加入__iter__f (self) 方法后变成可迭代的 并返回如下的错误,说明是类型不正确,但是已经能够发生迭代了 for i in A: TypeError: iter() returned non-iterator of type 'NoneType' (2)在此基础上增加一个新的类 class Stuends_iter(): 并同时含有__iter__()h和__next__()方法 (3)在class Students():的__iter__()方法中返回一个对象 结果为 None ,并且 None是无限的循环下去,说明已经变成了可以进行迭代的,只是返回值不正确而已 (4)在(3)的基础上加上一个正确的返回值,做如下的修改 def __next__(self): return "zhangsan" 得到的结果为不是None,而是变成了zhangsan ,说明迭代的基础已经能够实现了,但是仍是无限循环的, (5)需要停止循环的话,就需要确定长度,如何确定长度呢? 采用类之间的传参 def __iter__(self): return Stuends_iter(self) def __next__(self): # len_name = len(self.obj.nam) return self.obj.names[0] 传参的结果如下,已经能够成功打印列表中的第一个值 (6) 获取所有传递的列表的长度 len_name = len(self.obj.names) #获得了长度就可以用循环遍历了 (7)完成循环遍历,并且判断长度,存在问题,遍历结束后,仍没有退出 def __next__(self): all_len = len(self.obj.names) if self.nums < all_len: ret = self.obj.names[self.nums] self.nums += 1 return ret (8)需要想办法,让循环结束 解决方法:加else抛出异常情况 def __next__(self): all_len = len(self.obj.names) if self.nums < all_len: ret = self.obj.names[self.nums] self.nums += 1 return ret else: raise StopIteration (9)通过以上办法就实现了对象的迭代 """

class Students():
    def __init__(self):
        self.names = list()
        self.len = 0

    def add(self, name):
        self.names.append(name)

    def show(self):
        print(self.names)

    def get_lst(self):
        return len(self.names)

    def __iter__(self):  # 具有本方法的对象是可迭代的
        # return Stuends_iter(self)
        return self

    def __next__(self): # 具有本方法的对象是可迭代的,加上__next__()的方法才是迭代器
        if self.len < len(self.names):
            ret = self.names[self.len]
            self.len += 1
            return ret
        else:
            raise StopIteration


# class Stuends_iter():
#
# def __init__(self, obj):
# self.obj = obj
# self.nums = 0
#
# def __iter__(self):
# pass
#
# def __next__(self):
# all_len = len(self.obj.names)
# if self.nums < all_len:
# ret = self.obj.names[self.nums]
# self.nums += 1
# return ret
# else:
# raise StopIteration




if __name__ == "__main__":
    A = Students()
    A.add("Bob")
    A.add("Tom")
    A.add("Joe")
    A.add("Coe")

    A.add("Bob2")
    A.add("Tom2")
    A.add("Joe2")
    A.add("Coe2")

    for i in A:
        print(i)这里插入代码片

上面的代码,只用了一个类,类中增加了2个方法,就能够完成迭代器的工作,

算是本篇文章的核心点吧,现在已经完成了一个对象的可迭代
​结果和之前的一样,功能实现,帮助自己对迭代器的理解
​​

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

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

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

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

(0)


相关推荐

  • python环境搭建和pycharm的安装配置及汉化(零基础小白版)[通俗易懂]

    python环境搭建和pycharm的安装配置及汉化(零基础小白版)[通俗易懂]前言:写这篇文章主要是介绍一下python的环境搭建和pycharm的安装配置,适合零基础的同学观看。这篇文章你会学到python的环境搭建和python比较好用的IDEpycharm的安装与基础配置。运行环境:window64位操作系统。没想到这么多的人看这篇文章,并且接连不断给我发邮箱,问问题,这篇文章不是用markdown写的,不好改,我重新写了一份,放在我的博客里面,这里是地址…

  • 真实揭露:一段激情视频裸聊被骗的经历

    真实揭露:一段激情视频裸聊被骗的经历故事发生前几天放假的时候,那天我正在海边散步,有个人加我微信,备注了求助信息。当我通过了他的好友验证请求,他给我发来这样一段话。出于对luo聊诈骗套路的好奇,我对他的这段经历进行深入的了解。本文已获得受害者本人的授权,将这段视频luo聊被骗经历改编成故事发出来,希望能警醒更多的人。扒一扒视频luo聊受骗的经历只是无聊打发时间,在uki上和陌生人玩假扮情侣聊天。碰到个人,一上来就莫名…

  • 自己用命令强制删除占用的文件或文件夹

    自己用命令强制删除占用的文件或文件夹&#13; 前言&#13;有没有遇到过一些情况?软件卸载了,有些文件夹就是删不掉,提示被占用,mmp,这时候你肯定想到了360文件粉碎机!&#13;mmp,我就删个文件夹还要装个360?谁不知道360是个“大毒瘤”!&#13;自己动手丰衣足食!&#13; 正文&#13;这时候就想到了强大的shell命令,百度一波,还真找到了,&#13;DEL和RD这两个命令可以完…

  • 逻辑回归LR模型简介「建议收藏」

    逻辑回归LR模型简介「建议收藏」4.LR与线性回归的区别1.都是广义的线性回归,但LR可用于分类,在feature到结果的映射中加入了sigmoid(),实现了非线性。2.损失函数:线性回归–>平方损失函数;LR–>似然函数3.预测范围:线性回归–>整个实数域(敏感度一致);LR–>[0,1]…

    2022年10月13日
  • asp.net专业实习——网上花店系统

    asp.net专业实习——网上花店系统2019.5.2项目适用vs2010直接打开后更改数据库连接字符串即可如果在添加商品遇到报错,多半是输入的字符太多了链接:https://pan.baidu.com/s/1ulU89ogdHKRVGv9ad5Zszw提取码:he88复制这段内容后打开百度网盘手机App,操作更方便哦此项目是用vs2013开发,使用时需要重新配置连接字符串。。如果你的环境是vs20…

  • C语言飞机游戏

    C语言飞机游戏300行代码实现最简易的飞机小游戏,简单有趣,快来试试

发表回复

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

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