算法学习日记 day05

昨天还学习了一下python类的用法

​ 1.类的定义

​ 类一般用class定义,通用习惯为首字母大写,在python3中继承object类,什么是继承object类,我在知乎上找到了答案

继承 object 类的是新式类,不继承 object 类的是经典类,在 Python 2.7 里面新式类和经典类在多继承方面会有差异:

class A:
    def foo(self):
        print('called A.foo()')

class B(A):
    pass

class C(A):
    def foo(self):
        print('called C.foo()')

class D(B, C): 
    pass

if __name__ == '__main__':
    d = D() 
    d.foo()

B、C 是 A 的子类,D 多继承了 B、C 两个类,其中 C 重写了 A 中的 foo() 方法。

如果 A 是经典类(如上代码),当调用 D 的实例的 foo() 方法时,Python 会按照深度优先的方法去搜索 foo() ,路径是 B-A-C ,执行的是 A 中的 foo() ;

如果 A 是新式类,当调用 D 的实例的 foo() 方法时,Python 会按照广度优先的方法去搜索 foo() ,路径是 B-C-A ,执行的是 C 中的 foo() 。

因为 D 是直接继承 C 的,从逻辑上说,执行 C 中的 foo() 更加合理,因此新式类对多继承的处理更为合乎逻辑。

在 Python 3.x 中的新式类貌似已经兼容了经典类,无论 A 是否继承 object 类, D 实例中的 foo() 都会执行 C 中的 foo() 。但是在 Python 2.7 中这种差异仍然存在,因此还是推荐使用新式类,要继承 object 类。

类是模板,而实例则是根据类创建的对象。如何创建类和实例的语法如下,例如我们创造一个Bike类和叫giant和canyon的实例,giant和canyon都是自行车的一种。

class Bike(object):		#创建Bike类,Bike为类名
	pass		#用在空函数中表占位,不可缺省

giant=Bike()		#创造名字为giant的实例
canyon=Bike()		#创建名字为canyon的实例

​ 2.实例属性与类属性

实例属性用于区分不同的实例; 类属性是每个实例的共有属性。 好比每种自行车(如上文中的giant和canyon)都有车轱辘但他们的涂装各不相同,在这里实例属性就是涂装,类属性是车轱辘。在上文中我们创造了Bike类那么我们下一步就是对他进行初始化,我们为Bike类添加一个_init_(),方法当创建实例时,_init_()方法被自动调用为创建的实例增加实例属性。

class Bike(object):		#创建Bike类,Bike为类名
	def __init__(self, color): 		# 初始化一个属性color
       self.color = color   	# 表示给我们将为创建的实例属性color赋值

注意:_init_(self,color)中第一个参数必须为self,self代表类的实例,是通过类创建的实例 (定义类时这个实例我们还没有创建,它表示的我们使用类时创建的那个实例 ),可以用别的名字,但建议使用约定成俗的self ,后续参数则可以自由指定,和定义函数没有任何区别

类属性为所有实例共享的属性,如果在类上绑定属性,则所有实例都可以访问该类的属性,并且所有实例访问的类属性都是同一个 。车轱辘是BIke的共有属性,每个Bike都有两个车轱辘:

class Bike(object):  # 创建Bike类,Bike为类名
    wheel = 3.14  # 有两个车轱辘,类属性

    def __init__(self, color):  # 初始化一个实例属性color
        self.color = color  # 表示给我们将为创建的实例属性color赋值
        
giant=Bike(red)
canyon=Bike(blue)
print('----未修改前-----')
print('wheel=\t', Bike.wheel)
print('giant.wheel=\t', giant.wheel)  #  2
print('canyon.wheel=\t', canyon.wheel)  #  2
print('----通过类名修改后-----')
Bike.wheel = 4  # 通过类名修改类属性,所有实例的类属性被改变
print('wheel=\t', Bike.wheel)
print('giant.wheel=\t', giant.wheel)  #  4
print('canyon.wheel=\t', canyon.wheel)  #  4
print('----通过circle1实例名修改后-----')
giant.wheel=6   # 实际上这里是给giant创建了一个与类属性同名的实例属性
print('wheel=\t', Bike.wheel)     #  4
print('giant.wheel=\t', giant.wheel)  # 实例属性的访问优先级比类属性高,所以是6
print('canyon.wheel=\t', canyon.wheel)  #  4

注意:不可以用实例修改类属性!!!不可以用实例修改类属性!!!不可以用实例修改类属性!!!


数组:很简单,简单记一下使用方法

import numpy as np
A1=np.array([100,99,98])        #创建一维数组
A2=np.array([[100,99,98],[97,96,95],[94,93,92]])      #创造二维数组
A3=np.array([[[100,98,97],[96,95,94],[93,92,91]],[[90,89,88],[87,86,85]]])     #创建三维数组
print('三维数组中的第三维',A3[0])
print('三维数组中的第二维',A3[0][0])
print('三维数组中的第一维',A3[0][0][0])

:树是指至少具有一个根节点(Root)的树状结构的数据集合,节点之间具有层次关系。该树结构根节点在上,其他节点在下,底下的节点为叶子节点(Leaf),看起来像一棵倒挂的树。

1.树节点的特点

  • 只有一个根节点。
  • 每个节点有多个子节点或零个子节点。
  • 子节点又可以有多个子节点或零个子节点。
  • 底下的节点为叶子节点。
  • 任意一个子节点的上一个节点称为父节点。
  • 树的局部几个节点可以构成一个子树。
  • 层(Level)指根节点为1层,则它的子节点为2层,子节点的子节点为3层,以此推,直到底叶子层。一棵树的最大层数为该树的高度(Height)或深度(Depth)。

2.树分类

树根据子节点之间是否有顺序可以分为无序树、有序树。

  • 无序树(又称自由树)是指任意节点的子节点之间没有顺序关系。

  • 有序树是指任意节点的子节点之间有顺序关系。

    根据节点最多有几个子节点,可以分为二叉树(Binary Tree)和非二叉树。

  • 二叉树是指每个节点最多只有两个子节点的数据结构。

  • 非二叉树就是不是二叉树的树

3.二叉树特点

  • 在i层上至多有2(i-1)个节点(i≥1),如第2层的节点数为22-1=2。
  • 深度为d的二叉树至多有2d-1个节点(d≥1),如深度为d=3的二叉树的最多节点是23-1=7。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值