链表对象的封装

前言

前面我自己写了一个对链表对象的封装,现在看来,确实还得是大佬的封装思路更加完善

前言知识介绍

__init__方法

__init__方法是Python中的一个特殊方法,用于初始化一个新对象。当一个类的实例被创建时,__init__方法会被自动调用,用来对实例的属性进行初始化。这个方法可以接受参数,用来为实例的属性赋初值。通过__init__方法,可以确保实例在创建时具有必要的属性值,从而使得实例能够在被创建后立即可用。

__next__方法
1.__next__方法通常与迭代器对象的__iter__方法一起使用,以便在循环中使用迭代器对象。当循环遍历迭代器对象时,实际上是在调用迭代器对象的__next__方法来获取每个元素,直到StopIteration异常被触发。
2.总之,__next__方法的作用是实现迭代器对象的遍历行为,使得迭代器对象可以在循环中使用。
__iter__方法
1.__iter__是一个特殊方法,用于定义一个对象是可迭代的。当对象实现了__iter__方法时,它就可以被用于迭代,如在for循环中使用。
2.__iter__方法应该返回一个迭代器对象,通常是实现了__next__方法的对象。这个迭代器对象可以是自身,也可以是另一个对象,只要它实现了__next__方法。
3.总之,__iter__方法的作用是定义对象是可迭代的,并且返回一个迭代器对象,使得对象可以在for循环中使用。
__repr__方法
1.__repr__是Python中的一个特殊方法,用于返回对象的字符串表示形式。它通常用于调试和日志记录,以便在打印对象时能够清晰地看到对象的信息。
2.当调用内置函数repr()时,它会调用对象的__repr__方法来获取对象的字符串表示形式。如果一个对象没有实现__repr__方法,那么会调用默认的__repr__方法,它会返回对象的类名和内存地址的字符串表示形式。
3.__repr__方法的主要目的是提供对象的一种可读性良好的字符串表示形式,以便在调试和日志记录时能够清晰地看到对象的信息。因此,通常在实现自定义类时会重写__repr__方法,以便返回有意义的字符串表示形式。

代码实现

class LinkList:
    class Node:  # 创建一个结点类
        def __init__(self, item=None):
            self.item = item
            self.next = None

    class LinkListIterator:  # 此对象为链表的迭代对象
        def __init__(self, node):
            self.node = node

        def __next__(self):
            """
            __next__方法通常与迭代器对象的__iter__方法一起使用,以便在循环中使用迭代器对象。当循环遍历迭代器对象时,
            实际上是在调用迭代器对象的__next__方法来获取每个元素,直到StopIteration异常被触发。
            总之,__next__方法的作用是实现迭代器对象的遍历行为,使得迭代器对象可以在循环中使用。
            :return:
            """
            head_node=self.node
            if self.node:
                cur_node = self.node
                self.node = cur_node.next
                return cur_node.item
            else:
                self.node=head_node  # 重新将链表的移动结点归为头结点
                raise StopIteration

        def __iter__(self):
            """
            __iter__是一个特殊方法,用于定义一个对象是可迭代的。当对象实现了__iter__方法时,它就可以被用于迭代,如在for循环中使用。
            __iter__方法应该返回一个迭代器对象,通常是实现了__next__方法的对象。这个迭代器对象可以是自身,也可以是另一个对象,只要它实现了__next__方法。
            总之,__iter__方法的作用是定义对象是可迭代的,并且返回一个迭代器对象,使得对象可以在for循环中使用。
            :return:
            """
            return self

    def __init__(self, iterable=None):
        """
        :param iterable:此为传入的列表
        """
        self.head = None
        self.tail = None
        if iterable:
            self.extend(iterable)  # 有点类似的定义了一个列表中的extend方法

    def append(self, obj):
        s = LinkList.Node(obj)  # 创建一个节点对象
        if not self.head:  # 如果此链表中还不存在结点
            self.head = s
            self.tail = s
        else:
            self.tail.next = s  # 将链表节点对象置于尾节点后方,并且将尾节点指向最后插入的结点对象
            self.tail = s

    def extend(self, iterable):
        """
        :param iterable:传入一个列表
        :return:
        """
        for obj in iterable:
            self.append(obj)  # 调用append方法,将传入列表中的每一个元素以链表节点的形式存入

    def find(self, obj):
        for n in self:
            if n == obj:
                print(n)
                return True
            else:
                print(n)


    def __iter__(self):
        return self.LinkListIterator(self.head)

    def __repr__(self):
        """
        1.__repr__是Python中的一个特殊方法,用于返回对象的字符串表示形式。它通常用于调试和日志记录,以便在打印对象时能够清晰地看到对象的信息。
        2.当调用内置函数repr()时,它会调用对象的__repr__方法来获取对象的字符串表示形式。如果一个对象没有实现__repr__方法,那么会调用默认的__repr__方法,它会返回对象的类名和内存地址的字符串表示形式。
        3.__repr__方法的主要目的是提供对象的一种可读性良好的字符串表示形式,以便在调试和日志记录时能够清晰地看到对象的信息。因此,通常在实现自定义类时会重写__repr__方法,以便返回有意义的字符串表示形式。
        :return:
        """
        return "<<" + ",".join(map(str, self)) + ">>"


if __name__ == '__main__':
    lk = LinkList([1, 2, 3, 4, 5])
    for element in lk:
        print(element)
    print(lk)

    print(lk.find(3))



结果展示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/258732.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构和算法】 K 和数对的最大数目

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 方法一&#xff1a;双指针排序 三、代码 3.1 方法一&#xff1a;双指针排序 3.2 方法二&#xff1…

107基于matlab的模糊推理系统(ANFIS)的时间序列预测

基于matlab的模糊推理系统&#xff08;ANFIS&#xff09;的时间序列预测&#xff0c;输出训练集、测试集和预测数据结果&#xff0c;数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 107 时间序列预测模糊推理系统 (xiaohongshu.com)

管理类联考——数学——真题篇——按题型分类——充分性判断题——蒙猜A/B

老规矩&#xff0c;看目录&#xff0c;平均3-5题 文章目录 A/B2023真题&#xff08;2023-19&#xff09;-A-选项特点&#xff1a;两个等号&#xff1b;-判断需联立的难易&#xff1a;难&#xff0c;看着感觉需要联立&#xff0c;所以判断联立需要有理论支撑&#xff0c;不然还…

QT qAbs()、qRound()

1.qAbs qAbs:原型为 T qAbs(const T &value) 返回输入参数对应类型的绝对值&#xff0c;其中T为输入参数类型&#xff0c;也就是可以返回多种类型&#xff08;int,float,double型&#xff09; 代码示例&#xff1a; int d -1; float b -3.14; double c -4.36;int a_…

具有超低功耗性能的R7F102GAC3CSP、R7F102GAC2DSP、R7F102G6C3CSP RL78/G22微控制器 16-bit MCU

RL78/G22 简介&#xff1a; 除了具有低电流消耗&#xff08;CPU工作时&#xff1a;37.5μA/MHz&#xff1b;STOP时&#xff1a;200nA&#xff09;外&#xff0c;RL78/G22微控制器还配备了丰富的电容触摸通道。完备的16-48引脚封装和32KB-64KB闪存&#xff0c;扩充了新一代RL78…

PMP认证需要多少钱?

PMP认证费太贵&#xff1f;这些可以省下来&#xff01; 学习PMP认证到拿证的过程中一共有两个地方需要有费用支出&#xff0c;第一是PMP培训费用&#xff0c;第二就是PMP考试费用。 为什么一定要参加培训&#xff1f;这是PMI的考试条件中要求的&#xff0c;任何考生都需要有35学…

【C++】开源:ImGui图形用户界面库配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍ImGui图形用户界面库配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&…

【递归 回溯】LeetCode-226. 翻转二叉树

226. 翻转二叉树。 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xf…

实战篇:一文讲清楚电商平台用户评价分析

01 明确问题 随着电商平台的成熟&#xff0c;如何提升用户体验、提高客户留存率也成为了电商平台关注的重点。而用户评价是最直观地能反应用户体验的指标。用户差评更是其中的重点&#xff0c;通过差评分析&#xff0c;可以寻找到平台目前存在的可能导致用户打出差评的因素&am…

机器学习——特征选择(一)

【说明】文章内容来自《机器学习——基于sklearn》&#xff0c;用于学习记录。若有争议联系删除。 1、简介 特征选择&#xff0c;又称变量选择、属性选择或变量子集选择&#xff0c;是选择相关特征子集用于模型构造的过程。简要地说&#xff0c;通过检测相关特征。摒弃冗余特征…

TransXNet实战:使用 TransXNet实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

脉冲水表作用有哪些?

脉冲水表是一种新型的水表&#xff0c;它通过检测水流量并发送脉冲信号来计量用水量。与传统的机械水表相比&#xff0c;脉冲水表具有许多优势和作用。 首先&#xff0c;脉冲水表具有高精度和可靠性。传统的机械水表在长期使用过程中会因磨损而导致计量不准确&#xff0c;而脉冲…

【强化学习】Deep Q Learning

Deep Q Learning 在前两篇文章中&#xff0c;我们发现RL模型的目标是基于观察空间 (observations) 和最大化奖励和 (maximumize sum rewards) 的。 如果我们能够拟合出一个函数 (function) 来解决上述问题&#xff0c;那就可以避免存储一个 (在Double Q-Learning中甚至是两个…

Redis介绍与使用

1、Nosql 1.1 数据存储的发展 1.1.1 只使用Mysql 以前的网站访问量不大&#xff0c;单个数据库是完全够用的。 但是随着互联网的发展&#xff0c;就出现了很多的问题&#xff1a; 数据量太大&#xff0c;服务器放不下 访问量太大&#xff0c;服务器也承受不了 1.1.2 缓存…

STL stack练习

CSTL之stack栈容器 - 数据结构教程 - C语言网CSTL之stack栈容器1.再谈栈回顾一下之前所学的栈&#xff0c;栈是一种先进后出的数据结构&#xff0c;而实现方式需要创建多个结构体&#xff0c;通过链式的方式进行实现&#xff0c;这是标准的栈的思路&#xff0c;而在STL中栈可以…

ctfshow(web190-web200)

目录 web190 web191 web192 web193 web194 web195 web196 web197 web198 web199 web200 web190 为什么要有admin呢 这也是试出来的 这个admin必须是数据库中存在的 这样才能使用布尔注入 因为这个时候登录 有两种返回结果 一种密码错误 一种就是用户名错误 admin an…

HBase 整合 Phoenix

目录 一、Phoenix 简介 1.1 Phoenix定义 1.2 为什么使用 Phoenix 二、Phoenix 快速入门 2.1 安装部署 Phoenix 2.1.1 上传并解压 tar 包 2.1.2 复制 server 包并拷贝到各个节点的 hbase/lib 2.1.3 配置环境变量 2.1.4 重启 HBase 2.1.5 连接 Phoenix 2.2 Phoenix…

FBX模型 转换成带有空间参考的 3DTiles(.b3dm) 数据(FBX glTF 3DTiles)

目录 0 引言1 数据类型介绍1.1 FBX数据1.2 glTF数据1.3 3DTiles1.3.1 简介1.3.2 3DTiles格式的LOD是如何定义1.3.3 文件后缀格式 2 转换工具2.1 CesiumGS /3d-tiles-tools 工具2.1 glf-to-3d-tiles工具 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xf…

Linux下载安装Pychram社区版

一.背景 最近将开发也转到Linuxl发现vscode在Linux上面的速度个方面都比windows快太多了!!! 狠狠爱住,于是准备把pycharm也装上来,由于作者没有edu邮箱,于是拿社区版进行演示 二.具体步骤 2.1下载pycharm社区版 链接:下载PyCharm&#xff1a;JetBrains为专业开发者提供的P…

【经典LeetCode算法题目专栏分类】【第2期】组合与排列问题系列

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 组合总和1 class So…