购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.7 函数与类

函数代表了开发者要求程序做的一件事情的抽象,而类则代表了几件事情以一个逻辑单元为标准的组合。函数和类是所有编程语言不可或缺的组成部分,Python也不例外。

当发现两个程序片段极为类似,只有当中几个计算用到的数值或变量不同时,可以使用函数来封装程序片段,将流程中引用不同数值或变量的部分设计为参数。例如:

2.7.1 函数

1  max1 = a if a > b else b...
2  max2 = x if x > y else y...

函数是一种抽象,对流程的抽象。在定义了max()函数之后,客户端对求最大值的流程,被抽象为max(x, y)这样的函数调用,求值流程实例被隐藏起来。在Python中,函数不单只是定义,也是一个值。如下所示,可以将max指向的函数指定给maximum变量,通过maximum来调用。

1  def max(a, b):
2      return a if a > b else b
3
4  maximum = max
5  maximum(10, 20) # 传回 20

函数的使用分为定义(Definition)与调用(Call)。定义函数部分声明了程序有哪些指令;而函数只有在调用时才会真正地运行。

1  #  函数的使用(Def & Call),函数的执行顺序
2
3  # de fi ne funcetion
4  def max(a, b):
5      return a if a > b else b
6
7  # call function
8  max(10, 20)
9  x = max(10, 20)

定义函数时,除了为函数取名之外,也可以在“()”中设置输入参数。参数是一种沟通函数内与函数外(全局)的方式。用户可以在设置时利用“=”符号指定预设值。

1  #  参数与预设值
2
3  def f(x=100, y=200):
4      return x, y
5
6  f() # 100, 200
7  f(1, 2) # 1, 2

函数内和函数外是两个不同的区块,又称作用域(Scope),彼此互不影响。函数内的作用域称为本地(Local),函数外的作用域称为全局(Global)。函数内和函数外通过参数和返回值沟通。

 1  //  作用域(Local & Global)
 2
 3  x = 999
 4  y = 888
 5
 6  def f(x=100, y=200):
 7      print(x, y)
 8      return x, y
 9
10  print(x, y) # 999 888
11  f(1, 2) # 1 2
12  print(x, y) # 999 888
13  x, y = f(1, 2) # 1 2
14  print(x, y) # 1 2

2.7.2 类

类(Class)是具有相同属性及行为的对象加以抽象定义而成的类型,是一种抽象数据类型(Abstract Data Type,ADT),为对象的蓝图/规格。属性指的是静态描述/特征值,也就是变量;行为是对属性进行的动作,也就是函数。对象(Object)是类的实例(Instance),每个对象都唯一独立。在Python程序执行过程中,可以使用class声明类的实例。只有实例(对象)会占用内存空间。

在Python中,使用class定义类内的数据与操作的函数。函数__init__表示声明类别时会自动执行的函数,第一个参数为self,表示自己,第二个参数为输入类的数据,用户可以在声明属于该类的对象时,同时传入数据到该对象,传入的数据可以指定给“self.变量名称”,表示该对象有了储存数据的变量。

下面这个示例建立了一个Animal类,它有两个属性name和size、一个方法call()。初始化(__init__)给定一个名称。它的字符串描述(__str__)会是“名称(str)”。

声明类的对象时,同时传入初始化参数。这里声明了一个Animal对象a,它的属性name和size的值是cat和small。

1  a = Animal('cat', 'small')
2  print(a.name, a.size) # cat small
3  print(a) # cat(str)

下面介绍一下类的继承。原有的类可以被继承,延伸出新的类。原有的类被称为基础类(Base Class)或父类(Parent Class),新的类被称为衍生类(Derived Class)或子类(Child Class),这个衍生类自动继承基础类的变量与函数。

用户可以使用super()函数调用基础类的函数。若衍生类所需要的功能已经在基础类定义过了,用户就可以调用基础类,复用其程序代码。

当所有衍生类都需要更改,而且所需功能都相同时,若该功能可以通过更改基础类别实现,则直接修改基础类会影响所有的衍生类。利用衍生类与基础类的关系实现程序代码的复用,可以减少程序的错误,发挥对象导向程序设计的优点。以下为类的继承范例。 9FQhc63B2BHZOuxXVYnrR0p1zD0P5Yx2GVNcL7FQB4LB199dnYYPTXBucTD8FizM

1  class Dog(Animal):
2      def __init__(self, name, age, size):
3          super().__init__('小狗'+name, size)
4          self.age = age
5      def call(self):
6          print('汪汪汪')
7
8  d = Dog('小白', 13, 'small')
9  print(d.name)
点击中间区域
呼出菜单
上一章
目录
下一章
×