



函数代表了开发者要求程序做的一件事情的抽象,而类则代表了几件事情以一个逻辑单元为标准的组合。函数和类是所有编程语言不可或缺的组成部分,Python也不例外。
当发现两个程序片段极为类似,只有当中几个计算用到的数值或变量不同时,可以使用函数来封装程序片段,将流程中引用不同数值或变量的部分设计为参数。例如:
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
类(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()函数调用基础类的函数。若衍生类所需要的功能已经在基础类定义过了,用户就可以调用基础类,复用其程序代码。
当所有衍生类都需要更改,而且所需功能都相同时,若该功能可以通过更改基础类别实现,则直接修改基础类会影响所有的衍生类。利用衍生类与基础类的关系实现程序代码的复用,可以减少程序的错误,发挥对象导向程序设计的优点。以下为类的继承范例。
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)