Python 如何判断一个对象是否为单链表的节点

简介: Python 如何判断一个对象是否为单链表的节点

单链表节点类的初始化

1. class Node():
2. 
3. def __init__(self, value=None, Next=None):
4.         self.val = value
5.         self.next = Next



判断对象类型的两种方法

type() 或 instance(),用它们来测试:

>>> a,b,c = Node(),Node(1),Node(1,Node(2))
>>> type(a)==Node,type(b)==Node,type(c) is Node
(True, True, True)
>>> isinstance(a,Node),isinstance(b,Node),isinstance(c,Node)
(True, True, True)
>>> 
>>> num = 1
>>> type(num)==Node
False
>>> isinstance(num, Node)
False
>>> 
>>> nil = None
>>> type(nil)==Node
False
>>> isinstance(nil, Node)
False
>>> 



那么这样就够了吗?其实还存在问题:

>>> node1=Node(1,2)
>>> node2=Node(1,Node(2))
>>> node1
Node(1->2)
>>> node2
Node(1->2->None)
>>> isinstance(node1,Node)
True
>>> isinstance(node2,Node)
True
>>> isinstance(node1.next,Node)
False
>>> isinstance(node2.next,Node)
True


上面的测试中:node1的.next是整数2,也被认为是Node;但节点的本义 .next是要指向另一个节点的,所以要同时判断node和node.next都为Node才能认为它是节点:

>>> node1=Node(1,2)
>>> node2=Node(1,Node(2))
>>> isinstance(node1,Node) and isinstance(node1.next,Node)
False
>>> isinstance(node2,Node) and isinstance(node2.next,Node)
True
>>> 



改写成判断函数

>>> class Node():
  def __init__(self, value=None, Next=None):
    self.val = value
    self.next = Next
  def isNode(node):
    return isinstance(node,Node) and isinstance(node.next,Node)
>>> node1=Node(1,2); node2=Node(1,Node(2))
>>> node1.isNode()
False
>>> node2.isNode()
True
>>> 
>>> node3=Node()
>>> node3.isNode()
False
>>> node4=Node(1)
>>> node4.isNode()
False
>>> 


可以判断出.next值不是节点的“伪节点”了,但对空节点和单个节点来说,它们的 .next 值是None,显然也要加以判断,还好 isinstance的第二参数可以接收各种类型值作为元素的元组:

>>> class Node():
  def __init__(self, value=None, Next=None):
    self.val = value
    self.next = Next
  def isNode(node):
    return isinstance(node,Node) and isinstance(node.next,(Node,type(None)))
>>> node1=Node()
>>> node1.isNode()
True
>>> node2=Node(1)
>>> node2.isNode()
True
>>>

但又有一个小问题,如果用这个函数来判断其它类型数据,会不会返错?想过没有其它类型可就不一定有.next属性:

>>> num = 1
>>> num.next
Traceback (most recent call last):
  File "<pyshell#55>", line 1, in <module>
    num.next
AttributeError: 'int' object has no attribute 'next'
>>> nil = None
>>> nil.next
Traceback (most recent call last):
  File "<pyshell#57>", line 1, in <module>
    nil.next
AttributeError: 'NoneType' object has no attribute 'next'
>>> 
>>> Node.isNode(num)
False
>>> Node.isNode(nil)
False
>>> 

思考:为什么没有.next属性的数据类型照常能够正确判断出是非节点呢?


原因很简单,因为逻辑“与”运算 and 有个特性: A and B ,如果A==True整个式子就是True,根本不会去判断B,不管它是True还是False,甚至它即使是错的也不会管。所以这个判断式 isinstance(node,Node) and isinstance(node.next,(Node,type(None))) 是可以正常工作的,也就是说这个 isNode() 是成功的。



目录
相关文章
|
5月前
|
安全 大数据 程序员
Python operator模块的methodcaller:一行代码搞定对象方法调用的黑科技
`operator.methodcaller`是Python中处理对象方法调用的高效工具,替代冗长Lambda,提升代码可读性与性能。适用于数据过滤、排序、转换等场景,支持参数传递与链式调用,是函数式编程的隐藏利器。
197 4
|
6月前
|
安全 JavaScript Java
Python中None与NoneType的真相:从单例对象到类型系统的深度解析
本文通过10个真实场景,深入解析Python中表示“空值”的None与NoneType。从单例模式、函数返回值,到类型注解、性能优化,全面揭示None在语言设计与实际编程中的核心作用,帮助开发者正确高效地处理“无值”状态,写出更健壮、清晰的Python代码。
662 3
|
6月前
|
机器学习/深度学习 算法 调度
【切负荷】计及切负荷和直流潮流(DC-OPF)风-火-储经济调度模型研究【IEEE24节点】(Python代码实现)
【切负荷】计及切负荷和直流潮流(DC-OPF)风-火-储经济调度模型研究【IEEE24节点】(Python代码实现)
296 0
|
6月前
|
Python
解决Python中AttributeError:'image'对象缺少属性'read_file'的问题策略。
通过上述策略综合考虑,您将能够定位问题并确定如何解决它。记住,Python社区很庞大,也很乐于帮助解决问题,因此不要害怕在求助时提供尽可能多的上下文和您已经尝试过的解决方案。
187 0
|
10月前
|
Python
解决Python报错:DataFrame对象没有concat属性的多种方法(解决方案汇总)
总的来说,解决“DataFrame对象没有concat属性”的错误的关键是理解concat函数应该如何正确使用,以及Pandas库提供了哪些其他的数据连接方法。希望这些方法能帮助你解决问题。记住,编程就像是解谜游戏,每一个错误都是一个谜题,解决它们需要耐心和细心。
512 15
|
10月前
|
安全 测试技术 开发者
Python中的“空”:对象的判断与比较
在Python开发中,判断对象是否为“空”是常见操作,但其中暗藏诸多细节与误区。本文系统梳理了Python中“空”的判定逻辑,涵盖None类型、空容器、零值及自定义对象的“假值”状态,并对比不同判定方法的适用场景与性能。通过解析常见误区(如混用`==`和`is`、误判合法值等)及进阶技巧(类型安全检查、自定义对象逻辑、抽象基类兼容性等),帮助开发者准确区分各类“空”值,避免逻辑错误,同时优化代码性能与健壮性。掌握这些内容,能让开发者更深刻理解Python的对象模型与业务语义交集,从而选择最适合的判定策略。
409 5
|
10月前
|
人工智能 Python
[oeasy]python083_类_对象_成员方法_method_函数_function_isinstance
本文介绍了Python中类、对象、成员方法及函数的概念。通过超市商品分类的例子,形象地解释了“类型”的概念,如整型(int)和字符串(str)是两种不同的数据类型。整型对象支持数字求和,字符串对象支持拼接。使用`isinstance`函数可以判断对象是否属于特定类型,例如判断变量是否为整型。此外,还探讨了面向对象编程(OOP)与面向过程编程的区别,并简要介绍了`type`和`help`函数的用法。最后总结指出,不同类型的对象有不同的运算和方法,如字符串有`find`和`index`方法,而整型没有。更多内容可参考文末提供的蓝桥、GitHub和Gitee链接。
263 11
|
存储 数据处理 Python
Python如何显示对象的某个属性的所有值
本文介绍了如何在Python中使用`getattr`和`hasattr`函数来访问和检查对象的属性。通过这些工具,可以轻松遍历对象列表并提取特定属性的所有值,适用于数据处理和分析任务。示例包括获取对象列表中所有书籍的作者和检查动物对象的名称属性。
301 2
|
缓存 监控 算法
Python内存管理:掌握对象的生命周期与垃圾回收机制####
本文深入探讨了Python中的内存管理机制,特别是对象的生命周期和垃圾回收过程。通过理解引用计数、标记-清除及分代收集等核心概念,帮助开发者优化程序性能,避免内存泄漏。 ####
373 3
|
存储 缓存 Java
深度解密 Python 虚拟机的执行环境:栈帧对象
深度解密 Python 虚拟机的执行环境:栈帧对象
342 13

推荐镜像

更多