写给新手的 python 的教程(三)

简介: 写给新手的 python 的教程(三)

1. 面向对象

编程语言中,一般有两种编程思维,面向过程和面向对象。 面向过程即函数

面向过程,看重的是解决问题的过程。

这好比我们解决日常生活问题差不多,分析解决问题的步骤,然后一步一步的解决。

而面向对象是一种抽象,抽象是指用分类的眼光去看世界的一种方法。

Python 就是一门面向对象的语言

面向对象都有两个基本的概念,分别是类和对象。

  • 「类」

用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。

  • 「对象」

通过类定义的数据结构实例

1.1. 怎么理解类

可以将他理解为一个加强版的函数或者说是一个加强版的模板

类里面可以有属性(变量)和方法(函数)

1.2. 怎么定义类

知道了类是什么样子的,我们接下来就要学习怎么去定义类了。

类定义语法格式如下:

class ClassName():
    pass
class ClassName:
    pass

可以看到,我们是用 class 语句来自定义一个类的,其实这就好比我们是用 def 语句来定义一个函数一样。

类是变量和方法的集合包,那么我们来创建一个类。

class Stu:
    school = "SDAU"
    def where_from(self):
        print(f"我来自于{self.school}")
    def which_sex(self,sex=1):
        if sex:
            print("你是男生")
        else:
            print("你是女生")

1.3. 怎么调用类属性和类方法

我们定义了类之后,那么我们怎么调用类里面的属性和方法呢?

使用 .来去访问一个类的属性或者方法,所以对于我们自己构造的Stu

class Stu:
    school = "SDAU"
    def where_from(self):
        print("我来自于" + self.school)
    def which_sex(self,sex=1):
        if sex:
            print("你是男生")
        else:
            print("你是女生")
>>> s = Stu()
>>> s.school
'SDAU'
>>> s.where_from()
'我来自于SDAU'

1.4. 类和对象之间的关系

这部分内容主要讲类和对象,我们先来说说类和对象之间的关系。

「类是对象的模板」

我们得先有了类,才能制作出对象。

类就相对于工厂里面的模具,对象就是根据模具制造出来的产品。

「从模具变成产品的过程,我们就称为类的实例化。」

「类实例化之后,就变成对象了。也就是相当于例子中的产品。」

1.5. 初始化函数

初始化函数的意思是,当你创建一个实例的时候,这个函数就会被调用。

先对上面的类进行改装

class Stu:
    school = "SDAU"
    def __init__(self):
        print("这是一个初始化函数,在进行实例化的时候这个函数就会自动运行")
    def where_from(self):
        print("我来自于" + self.school)
    def which_sex(self,sex=1):
        if sex:
            print("你是男生")
        else:
            print("你是女生")

当代码在执行 s = Stu() 的语句时,就自动调用了 __init__(self) 函数。

「而这个 __init__(self)  函数就是初始化函数,也叫构造函数。」

初始化函数的写法是固定的格式:中间是 init,意思是初始化,然后前后都要有【双下划线】, __init__() 函数的第一个参数一定要写上 self,不然会报错。

构造函数(初始化函数)格式如下:

def __init__(self,[...):
    ...

初始化函数一样可以传递参数的,例如:

class Stu:
    school = "SDAU"
    def __init__(self,name):
        self.name = name
    def where_from(self):
        print("我来自于" + self.school + '的' + self.name)
    def which_sex(self,sex=1):
        if sex:
            print("你是男生")
        else:
            print("你是女生")

将一个方法变成一个属性,使用@property装饰器

class Stu:
    school = "SDAU"
    def __init__(self,name):
        self.name = name
    @property
    def where_from(self):
        print(f"我来自于{self.school}的{self.name}")
        return school
    def which_sex(self,sex=1):
        if sex:
            print("你是男生")
        else:
            print("你是女生")


1.6. 类的特性

面向对象有三个特点,分别是继承、多态、封装,这里只讲继承特性。继承和生活中的继承类似,就是说继承者可以拥有被继承者的东西。下面我们先来看下面一段代码。

class Dog:
    def eat(self,food):
        print(food)
class Cat:
    def eat(self,food):
        print(food)

我们定义了两个类,分别是DogCat他们都有eat方法,但是可以发现eat方法做的事情是一样的,这里都只是打印一下,可以想象一下,如果做的事情很复杂,写的代码也就随之增加,那么这个时候就意味着两个类的eat方法会很长,但是又相同,那么有没有一个方法可以只写一遍,就可以被这两个类所使用那?答案是有的,继承是一个有效的方法。

class Animal:
    def eat(self,food):
        print(food)
class Cat(Animal):
    ...
class Dog(Animal):
    ...

通过创建一个Animal类,让DogCat都继承自他,这样就可以拥有Animal的方法,从而减少代码量,便于维护。

2. 错误处理

2.1. 错误类型

先来看一段代码

a = 1/0
print("这一行不会运行,因为第一行就报错了")

上面的代码如果放到python中运行会报错ZeroDivisionError: sectionision by zero因为分母不能为0

大家可以想一个问题,在我们写代码的过程中,总是避免不了出错,只要出现错误我们的程序就不会再继续运行。错误有两种

「一种是写代码过程中出现的语法错误」

list1 = [1,2,3,4]
for i in list1  #这里会报错,因为没有加冒号,属于语法错误
    print(i)
# SyntaxError: invalid syntax

「一种是除语法错误之外的错误」

a = 1/0  # 这里会报错,因为0不能作为分母

我们要讲的错误处理就是为了解决第二种错误,除语法错误之外的错误

错误处理的本质就是让程序不在纠结迷茫

2.2. 错误捕捉

python中使用try-except语句来进行错误的捕捉,具体的看下面的例子

try:
    a = 1/0
except:
    print("a = 1/0这一句有错误时,就会运行这一句")
else:
    print("a = 1/0这一句没有错误时,就会运行这一句")
finally:
    print("无论a = 1/0这一句有没有错误时,这一句都会运行")

如果我们希望获取错误信息

try:
    a = 1/0
except Exception as e:  
    # 这里的Exception代表所有的错误类型
    # 就说是只要是报错,错误都都属于Exception
    print(e)

2.3. 错误抛出

使用raise关键字来抛出错误

raise 错误的名字("对错误的说明")

举个例子

def convert(list_data):
    if isinstance(list_data,list):
        raise TypeError(u"这个函数的作用对象是一个列表")
    else:
        return [i*i for i in list_data]

2.4. 自定义错误

python中自定义错误的实现是基于类的继承来实现的

# 定义错误
class MyError(Exception):
    # 使用类的继承
    pass
# 在代码中使用自定义的错误
try:
    raise MyError("这是一个我自定义的错误类型")
except MyError as e:
    print(e)

完~

相关文章
|
19天前
|
存储 Python
SciPy 教程 之 SciPy 稀疏矩阵 4
SciPy 教程之 SciPy 稀疏矩阵 4:介绍稀疏矩阵的概念、类型及其在科学计算中的应用。SciPy 的 `scipy.sparse` 模块提供了处理稀疏矩阵的工具,重点讲解了 CSC 和 CSR 两种格式,并通过示例演示了如何创建和操作 CSR 矩阵。
41 3
|
5天前
|
BI Python
SciPy 教程 之 Scipy 显著性检验 8
本教程介绍SciPy中显著性检验的应用,包括如何利用scipy.stats模块进行显著性检验,以判断样本与总体假设间的差异是否显著。通过示例代码展示了如何使用describe()函数获取数组的统计描述信息,如观测次数、最小最大值、均值、方差等。
13 1
|
6天前
|
Python
SciPy 教程 之 Scipy 显著性检验 6
显著性检验是统计学中用于判断样本与总体假设间是否存在显著差异的方法。SciPy的scipy.stats模块提供了执行显著性检验的工具,如T检验,用于比较两组数据的均值是否来自同一分布。通过ttest_ind()函数,可以获取两样本的t统计量和p值,进而判断差异是否显著。示例代码展示了如何使用该函数进行T检验并输出结果。
10 1
|
8天前
|
Python
SciPy 教程 之 Scipy 显著性检验 3
本教程介绍Scipy显著性检验,包括其基本概念、原理及应用。显著性检验用于判断样本与总体假设间的差异是否显著,是统计学中的重要工具。Scipy通过`scipy.stats`模块提供了相关功能,支持双边检验等方法。
16 1
|
10天前
|
机器学习/深度学习 Python
SciPy 教程 之 SciPy 插值 2
SciPy插值教程:介绍插值概念及其在数值分析中的应用,特别是在处理数据缺失时的插补和平滑数据集。SciPy的`scipy.interpolate`模块提供了强大的插值功能,如一维插值和样条插值。通过`UnivariateSpline()`函数,可以轻松实现单变量插值,示例代码展示了如何对非线性点进行插值计算。
12 3
|
13天前
|
机器学习/深度学习 数据处理 Python
SciPy 教程 之 SciPy 空间数据 4
本教程介绍了SciPy的空间数据处理功能,主要通过scipy.spatial模块实现。内容涵盖空间数据的基本概念、距离矩阵的定义及其在生物信息学中的应用,以及如何计算欧几里得距离。示例代码展示了如何使用SciPy计算两点间的欧几里得距离。
29 5
|
12天前
|
机器学习/深度学习 Python
SciPy 教程 之 SciPy 空间数据 6
本教程介绍了SciPy处理空间数据的方法,包括使用scipy.spatial模块进行点位置判断、最近点计算等内容。还详细讲解了距离矩阵的概念及其应用,如在生物信息学中表示蛋白质结构等。最后,通过实例演示了如何计算两点间的余弦距离。
23 3
|
11天前
|
机器学习/深度学习 数据处理 Python
SciPy 教程 之 SciPy 空间数据 7
本教程介绍了SciPy的空间数据处理功能,涵盖如何使用`scipy.spatial`模块进行点的位置判断、最近点计算等操作。还详细解释了距离矩阵的概念及其在生物信息学中的应用,以及汉明距离的定义和计算方法。示例代码展示了如何计算两个点之间的汉明距离。
21 1
|
15天前
|
Python
SciPy 教程 之 SciPy 图结构 7
《SciPy 教程 之 SciPy 图结构 7》介绍了 SciPy 中处理图结构的方法。图是由节点和边组成的集合,用于表示对象及其之间的关系。scipy.sparse.csgraph 模块提供了多种图处理功能,如 `breadth_first_order()` 方法可按广度优先顺序遍历图。示例代码展示了如何使用该方法从给定的邻接矩阵中获取广度优先遍历的顺序。
25 2
|
15天前
|
算法 Python
SciPy 教程 之 SciPy 图结构 5
SciPy 图结构教程,介绍图的基本概念和SciPy中处理图结构的模块scipy.sparse.csgraph。重点讲解贝尔曼-福特算法,用于求解任意两点间最短路径,支持有向图和负权边。通过示例演示如何使用bellman_ford()方法计算最短路径。
27 3
下一篇
无影云桌面