深度学习:卷积神经网络技术与实践
上QQ阅读APP看书,第一时间看更新

2.7 函数

在本节中,我们将介绍如何编写函数。函数是带有名字的代码块,用于完成具体的工作。要执行函数定义的特定任务,可调用该函数。如果需要在程序中多次执行同一项任务,只需调用执行该任务的函数,让Python运行其中的代码即可。可以发现,通过使用函数,程序的编写、阅读、测试和修复都变得更容易。此外,在本节中,还可以学习到向函数传递参数的方式。

2.7.1 函数的定义与调用

在Python中,函数是一种运算或处理过程,即将一个程序段完成的运算或处理过程放在一个自定义的函数中完成。这种操作首先要定义一个函数,然后根据实际需要可以多次调用它,而不用再次编写,可以减少很大的工作量。

1.函数的定义

下面我们来看一个编程语言中最经典的例子。

【例2-11】创建打招呼函数。


def greet():                   # 定义一个greet函数
      print("Hello World")     # 打印输出“Hello World”
      print("Hello Python")    # 打印输出“Hello Python”
greet()    # 函数调用

程序运行结果如图2-19所示。

图2-19 打招呼显示结果

在上面的函数中,关键字def来告诉Python要定义一个函数,这就是函数定义。它向Python指出了函数名,在这里,函数名为greet(),它不需要任何信息就能完成其工作,因此括号中是空的(必不可少)。最后,定义以冒号结尾。紧跟在“def greet():”后面的所有缩进语句构成函数体。该函数只做一项工作:打印“Hello World”和“Hello Python”。

经过上面的实例分析,可以得到Python函数定义的一般格式为:


def 函数名([形式参数]):
    函数体

2.函数的调用

有了函数的定义后,在之后的编程中,但凡需要用到这个函数都可以直接调用。函数调用的一般格式为:


函数名(实际参数表)

如果定义的函数有形式参数,那么可以在调用函数时传入实际参数。当然,如果没有,可以不传,只是一个空括号。但是需要注意的是,无论有没有参数的传递,函数名后的括号都不可以省略。

【例2-12】定义一个没有形参的函数,然后调用它。


def sayHello():                # 定义一个sayHello函数
    print("***************")   # 打印分隔线
    print("Hello World")
    print("Hello Python")
    print("***************")
#  调用sayHello函数
sayHello()

程序运行结果如图2-20所示。

【例2-13】已知三角形三边长a、b、c,求三角形面积。

根据海伦公式计算三角形面积。


import math
def angle_area(a,b,c):                    # 定义一个angle_area函数
    p = (a+b+c)/2
    s = math.sqrt(p*(p-a)*(p-b)*(p-c))    # 利用海伦公式计算三角形面积
    return s
#  调用angle_area函数
area_s = angle_area (3,4,5)
print("三角形面积为:", area_s)

程序运行结果如图2-21所示。

图2-20 sayHello显示结果

图2-21 三角形面积显示结果

2.7.2 参数传递

在调用带有参数的函数时会有函数之间的数据传递。其中,形参是函数定义时由用户定义的形式上的变量,实参是函数被调用时主调函数为被调函数提供的原始数据。

鉴于函数定义中可能包含多个形参,因此函数调用中也可能包含多个实参。向函数传递实参的方式很多,可使用位置实参,这要求实参的顺序与形参的顺序相同;也可使用关键字实参,其中每个实参都由变量名和值组成。下面来依次介绍这些方式。

1.位置实参

在调用函数时,Python必须将函数调用中的每个实参都关联到函数定义中的一个形参。为此,最简单的关联方式是基于实参的顺序。这种关联方式被称为位置实参。

【例2-14】位置实参演示。


def person(name_n, sex_o):         # 定义一个person函数
    print("My name is " ,name_n )
    print("I am a " ,sex_o)
# 调用函数
person('LiHua', 'man')

程序运算结果如图2-22所示。

图2-22 位置实参演示结果

这个函数的定义表明,它需要一个名字和一个性别。调用person()时,需要按顺序提供一个名字和一个性别。

可以根据需要调用函数任意多次。要再描述一个人,只需再次调用person()即可。

【例2-15】函数调用演示。


def person(name_n, sex_o):            # 定义一个person函数
    print("My name is " ,name_n )     # 输出名字
    print("I am a " ,sex_o)           # 输出性别
# 调用函数
person('LiHua', 'man')
person('xiaoming', 'man')

程序输出结果如图2-23所示。

图2-23 函数调用演示结果

在函数中,可根据需要使用任意数量的位置实参,Python将按顺序将函数调用中的实参关联到函数定义中相应的形参。

2.关键字参数

关键字参数是传递给函数的名称。由于直接在实参中将名称和值关联起来了,因此向函数传递实参时不会混淆。使用关键字实参时无需考虑函数调用中的实参顺序,而且还可清楚地指出函数调用中各个值的用途。

在Python中,关键字参数的形式为:


形参名=实参值

【例2-16】关键字参数演示。


def person(name_n, sex_o):         # 定义一个person函数
    print("My name is " ,name_n )
    print("I am a ", sex_o)
# 调用函数
person(name_n = 'LiHua',sex_o= 'man')

程序运行结果如图2-24所示。

图2-24 关键字参数演示结果

3.默认值参数

编写函数时,可给每个形参指定默认值。在调用函数中给形参提供实参时,Python将使用指定的实参值;否则,将使用形参的默认值。因此,给形参指定默认值后,可在函数调用中省略相应的实参。

在Python中,默认值参数的形式为:


形参名=默认值

【例2-17】默认值参数演示。


def person(name_n, sex_o= 'man'):         # 定义一个person函数
    print("My name is " ,name_n )
    print("I am a ", sex_o)
# 调用函数
person(name_o = 'LiHong',sex_o='women')   # 修改第2个参数
person(name_o = 'LiHua')                  # 采用默认值参数

程序运行结果如图2-25所示。

图2-25 默认值参数演示结果

在调用带默认值参数的函数时,可以不对默认值参数赋值,也可以通过赋值来代替默认值参数的值。

注意:在使用默认值参数时,默认值参数必须出现在形参表的最右端,否则会出错。