
4.1.1 自定义函数的定义与调用

4.1.1 自定义函数的定义与调用
函数是一个被指定名称的程序块。在要使用该程序块时,只要通过函数名调用该函数即可。
1.函数的定义
当需要在程序中多次用到某个公式或要多次处理某个函数关系,而又没有现成的内部函数可以使用时,程序员可以自己定义所需的函数并调用它们,这样的函数称为自定义函数(User Defined Function)。自定义函数与内部函数一样,可以在程序或函数中调用。定义函数的语法格式如下:

说明:
1)函数名可以是一个合法的标识符。从程序的可读性角度来看,函数名应该由一个或多个有意义的单词组成,每个单词的字母全部小写,单词与单词之间使用下画线分隔。
2)形参列表用于定义该函数可以接收的参数。形参列表由多个形参名组成,各个形参名之间以逗号“,”隔开,且都不用指定形参的数据类型。注意,即使函数不需要参数,也必须保留一对空的小括号“()”。
3)函数体位于冒号之后,由零条或多条可执行语句组成程序块,程序块内的语句具有相同的缩进。
4)在语法格式上,用方括号“[]”括起来的内容为可选择部分,即可以使用,也可以省略。return语句就是可选的,它可以在函数体内的任何地方出现,表示函数调用执行到此结束。如果没有return语句,则自动返回None;如果有return语句,但是return语句后面没有表达式或者值,则也返回None。
5)返回值可以是一个表达式或值,不需要指定函数返回值的数据类型。
【例4-1】 定义一个函数hello(),输出“Hello World!”(不用return语句)

【例4-2】 定义矩形面积的自定义函数area()。

【例4-3】 定义一个计算圆面积的函数circle()。

2.函数的调用
定义好的函数并不会立即执行,而是需要在程序中调用才能执行。调用函数也就是执行函数。由于函数返回一个值,在调用时完全可以把用户定义函数像使用内部函数一样,把它写在表达式中就可。调用函数的基本语法格式如下:

说明:
1)函数名是要调用的函数的名称。
2)实参列表是创建函数时要求传入的各个形参的值。需要注意的是,定义函数时有多少个形参,那么调用函数时就需要传入多少个值,且顺序必须和定义函数时一致。即便该函数没有参数,函数名后的小括号也不能省略。
3)由于Python是解释型语言,因此定义函数的语句def必须放在调用该函数的程序段前面,否则在运行时系统提示“NameError:name'函数名'is not defined”。
【例4-4】 调用前面实例中定义的3个函数。

在IDLE中,可以把函数的定义和调用函数的主程序写在一个.py文件中,注意定义函数的语句必须写在调用该函数的语句之前。程序和运行结果如图4-1所示。

图4-1 例4-4程序和运行结果
3.函数应用实例
【例4-5】 定义函数,实现计算5!+6!+8!的值。
分析:要计算s=5!+6!+8!,先要分别计算出5!、6!和8!。由于3个求阶乘的运算过程完全相同,因此可以用函数fact()来计算阶乘,再调用3次fact()函数便可求得s。
定义计算阶乘的fact()函数:

调用函数fact()实现计算5!+6!+8!的值的主程序为:

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

图4-2 例4-5程序和运行结果
【例4-6】 输入参数n和m,求组合数的值。
分析:求组合数用函数comb()来实现,求阶乘n!用函数fact()来实现。在执行comb()函数的过程中要多次调用fact()函数,即嵌套调用函数。
求阶乘的fact()函数参考例4-5。求组合数的comb()函数的程序如下:

主程序为:

运行程序,分别输入参数m和n,输出组合数结果;如果m>n,则提示输入数据不正确,程序和运行结果如图4-3所示。

图4-3 例4-6程序和运行结果
对于C、C++、Java、C#等程序语言,程序都必须有一个入口,都用一个main()函数作为程序的入口,也就是程序的运行是从main()函数开始的。
而Python则不同,它属于脚本语言,是从脚本第一行开始运行,没有统一的入口。为了阅读方便,程序员会定义一个main()函数作为主程序的入口,然后写一个调用main()函数的语句。例4-6的程序可以改为如下:
