python学习记录(3)——类,链表

创建类

例子:

class Dog():
"""模拟小狗"""
	def __init__(self,name,age):
	"""初始化属性年龄名字"""
		self.name=name
		self.age=age
	def sit(self):
	"""模拟小狗被命令蹲下"""
		print(self.name.title()+"is now sitting")

说明: 类中的函数称为方法。

  1. 通常约定首字母大写的名称为类
  2. __ init()__ 是一个特殊的方法,每次根据Dog类创建实例时,python会自动运行它。加下划线是一种约定,为了避免python默认方法和普通方法之间发生名称冲突。
  3. 不同的类中可以有相同的方法名。
  4. 参数self的作用比较特殊,它是一个指向实例本身的引用,让实例可以访问类中的属性和方法。因此创建方法时,参数self必不可少,且必须位于其它形参前面。python调用与该类相关的方法时,将自动传入实参self,根据Dog类创建实例时,只需给后两个形参(name,age)提供值即可。
  5. __ init__中定义的两个变量均含有前缀self。self.name(self.age)作用在于获取形参name(age)中的值并存储到变量name(age)中,并将该变量关联至当前创建的实例。

创建实例

my_dog=Dog('willie',6)		#创建实例并储存在my_dog中
my_dog.name		#访问属性name
my_dog.sit		#调用方法

魔法函数

魔法函数(Magic Methods),是Python的一种高级语法,允许你在类中自定义函数(函数名格式一般为__xx__),并绑定到类的特殊方法中。

  • 比如在类A中自定义__str__()函数,则在调用str(A())时,会自动调用__str__()函数,并返回相应的结果。在我们平时的使用中,可能经常使用__init__函数(构造函数)和__del__函数(析构函数),其实这也是魔法函数的一种。
  • Python中以双下划线(xx)开始和结束的函数(不可自己定义)为魔法函数。 调用类实例化的对象的方法时自动调用魔法函数。在自己定义的类中,可以实现之前的内置函数。

init

  • 所有类的超类object,有一个默认包含pass的__ init __()实现,这个函数会在对象初始化的时候调用,我们可以选择实现,也可以选择不实现,一般建议是实现的,不实现对象属性就不会被初始化。初始化类中某个变量之后,实例化直接就能够调用 该变量的值;如果没有用构造方法初始化值,就不能够调用。
  • init() 方法可以包含多个参数,但必须包含一个名为 self 的参数,且必须作为第一个参数。也就是说,类的构造方法最少也要有一个 self 参数,仅包含 self 参数的__init__() 构造方法,又称为类的默认构造方法。
  • 注意:构造方法中的初始值无法继承,即在B类中调用A类,B类无法继承A类中的初始值,也就无法调用该值

链表

基本概念

链表是通过一个个节点(Node)组成的,每个节点都包含了称为数据域(value)和指针域(next)的基本单元,每个节点的指针指向下一个节点。head节点没有value,其作用是保存首地址,最后一个节点的指针域则指向一个空值。
它也是一种递归的数据结构。它能保持数据之间的逻辑顺序,但存储空间不必按照顺序存储。

定义节点

class ListNode():
    """单链表的结点"""
	def __init__(self, item, next = None):
        # item存放数据元素
        self.item = item
        # next是下一个节点的标识
        self.next = next

说明:next=None是为next设置的默认值,如果调用过程中赋了实参就使用该实参,不赋值就默认使用None。

问题

将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 (来自力扣)

解答

不用递归

def mergeTwoLists(self, l1, l2):
"""l1,l2作为链表输入"""
    c = head = ListNode(None)
    """定义头节点"""
    while l1 and l2:
        if l1.val < l2.val:
            c.next = l1
           	"""c指向较小值"""
            l1 = l1.next
           	"""传向l1的下一个值直到最后一个数(l1.next=None"""                
        else:           
			c.next = l2
            l2 = l2.next
        c = c.next
        """c跳至本次循环的较小值,等待下次比较结果"""
    c.next = l1 or l2
    """c指向非空的剩余节点"""
    return head.next

思路:此处的节点c就像一根针将所有节点按照大小顺序串了起来,最后只需返回头节点即可

使用递归

def mergeTwoLists(self,l1,l2):
    if l1 is None:
        return l2
    elif l2 is None:
        return l1
    elif l1.val < l2.val:
        l1.next = mergeTwoLists(l1.next, l2)
        return l1
        """每次输出较小值,并使之指向下一个较小值"""
    else:
        l2.next = mergeTwoLists(l1, l2.next)
        return l2

创建链表

创建链表时,利用类的定义创建

  • 第一步:定义两个头节点,一个固定不动用来记住地址,一个动态向后,注意不要给后者的参数为None,否则NoneType无法添加val或next。
head = temp = ListNode(0)
  • 第二步:定义后续节点,根据需求进行循环
for i in range(10):
	temp.next = ListNode(8)
	temp = temp.next
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值