The best way to learn a programming language is to write a lot of code and read a lot of code.
我们的程序很快就会变得越来越大,越来越复杂。需要一些方法把它们分成较小的部分进行组织,这样更易于编写,也更容易明白。
要把程序分解成较小的部分,主要有3种方法。函数(function)就像是代码的积木,可以反复地使用。利用对象(object),可以把程序中的各部分描述为自包含的单元。模块(module)就是包含程序各部分的单独的文件。
在这一篇中,我们将学习函数,后面两篇会讨论对象和模块。学习完这些知识,我们就具备了所需要的全部基本工具,可以开始使用图形和声音并且创建游戏了。
乐高积木-函数
最简单地讲,函数就是可以完成某个工作的代码块。这是可以用来构建更大程序的一个小部分。可以把这个小部分与其他部分放在一起,就像乐高积木搭房子一样。
创建一个积木
创建或定义函数要使用Python的def关键字。然后可以利用函数名来使用或调用这个函数。下面先来看一个简单的代码例子,它首先定义了一个函数,然后使用这个函数。这个函数会在屏幕上打印一个邮件地址。
第1行中,我们使用def关键字定义了一个函数。在函数名(printMyAddress)后面有一对括号“( )”,然后是一个冒号:
后面很快就会解释这个括号做什么用。冒号告诉Python接下来是一个代码块,这个之前讨论的for循环、while循环和if语句中的一样。
下面我们来看看这个函数运行步骤:
从这里开始。这是主程序的开始。
调用函数时,跳到函数中的第一行代码。
执行函数中的每一行代码。
函数完成时,从离开主程序的那个位置继续执行。
注意:
def中的代码块并不是主程序的一部分,所以程序运行时,它全跳过这个def代码块,从def代码块以外的第一行代码开始运行。
实际上,就像你在拼搭一个房子,需要用到某个名字为printMyAddress()的横梁积木时,那么你就要找出(写出)printMyAddress()积木名,它就会供你所有了。
使用积木
就像上述说的那样,当你找出(写出)printMyAddress()积木名,这样的操作就说明要运行这个名为printMyAddress()函数的代码了。当然,如果我们定义了一个函数,但是从来都没有使用它时,这个函数块内的代码是永远不会运行的,因为你根本就从没拿过这个积木来搭建你的房子。
使用(调用)函数时要使用函数名和一对括号。当然,这个括号里还能包含一些东西,或者什么也没有。
我们看看运行刚才的那个例子,你会看到这样的结果:
上述的结果我们也可以不用函数来得出,如下:
那为什么要自找麻烦使用函数来让问题更复杂呢?
其实我们使用函数的主要原因是,一旦定义了函数,就可以通过调用反复地使用。所以如果我们想把地址打印5次,可以这样来做:
输出将是:
你也可能会说,用之前学习的循环也能做出同样的事情。
是的,对于这种循环做同样的事情,for循环或while循环是强项,但如果我们希望在程序的不同位置打印地址,而不是全部都一次完成,循环就实现不了了。而这种像积木一样的函数,只要你制作好一块积木后,无论在什么时候你想用它时,只需要找出(写出)它的名字,就可以直接使用。
当然,学习使用函数还有一个原因,每次函数运行时可以让它有不同的表现。下面我们将会学习到。
向函数传递参数
刚刚我们说过,使用(调用)函数时要使用函数名和一对括号。当然,这个括号里还能包含一些东西,或者什么也没有。
现在来看括号做什么用:它用来传递参数。在编程中,参数这个词是指你交给函数的一条信息。我们把这称为:你向函数传递参数。
单个参数的函数
假设你希望对你的所有家庭成员使用这个地址打印函数。所有人的地址都是一样的,但是每一次人名会有所不同。不能在函数中把人名硬编码写成Warren Sande,你可以建立一个变量。调用函数时将这个变量传递到函数。
我们将上面打印地址的函数修改一下,使用一个对应人名的参数。参数是有名字的,就像其他变量一样,我们把这个变量命名为someName。代码如下:
运行代码,你会得到期望的结果:
这看上去与第一个程序(没有使用参数)得到的输出完全相同。不过,我们每次用不同方式打印地址,比如:
现在每次调用函数时输出都不同。人名会变,因为我们每次都向函数传入了不同的人名。
注意,我们向函数传入什么值,函数中就会使用什么值,并作为地址的人名部分打印出来。
有多个参数的函数
如果每次函数运行时有多个信息不同,比如要向街道上的所有人发信,每一次街道门牌号都不相同,这就需要多个参数了。
现在我们来看一个带两个参数的例子。在这个基础上,你可以根据具体需要为程序中的函数增加参数。
要向街道上的每个人发送信,我们的地址打印函数就需要两个参数:一个对应的人名,另一个是对应的门牌号。如下这个函数代码:
它的运行结果如下:
使用多个参数时,要用逗号来分隔,就像列表中的元素一样,这就引入了下个话题……
多少参数较为合适
前面说过,想向函数传递多少参数就可以有多少个参数。这一点不假,但是如果你的函数有超过5到6个参数,可能就应该考虑采用别的做法了。一种做法是把所有参数收集到一个列表中,然后把这个列表传递到函数。这样一来,就只是传递一个变量(列表变量),只不过其中包含有一组值。这样可以让你的代码更易读。
有返回值的函数
目前为止,函数只是为我们做一些工作。不过函数的一个突出作用是:它们还可以向你发回一些东西。
我们已经知道,可以向函数发送信息(参数),不过函数还可以向调用者发回信息。从函数返回的值称为结果(result)或返回值(return value)。
返回一个值
要让函数返回一个值,需要在函数中使用Python关键字return。下面给出一个例子:
这会把值taxTotal发回到调用这个函数的程序部分。
不过发回的这个值时,它会去哪里呢?返回值会回到调用这个函数的代码。看下面的例子,在IDLE输入下面代码:
运行后,在IDLE输入下面代码,得出结果如下:
calculateTax函数会返回一个值:10.8108,这个值将赋给totalPrice。
在上面的这个例子中,函数会运行,计算出税后的总价格。
下面我们来建立一个有返回值的函数程序。calculateTax()函数返回了一个值。向这个函数提供税前价格和税率,它会返回税后价格。我们把这个值赋给一个变量。所以不像前面那样只是使用函数的名,这里还需要一个变量和一个等号(=),然后是函数名。变量会赋为calculateTax()函数返回的结果。
运行这个程序,可以让用户输入价格,并得出总价格,如下结果:
如果程序必须要处理不同的税率,还可以修改下税率让用户来输入,你想到怎么修改了吗?
END
回顾
什么是函数。
什么是参数。
如何向函数传递一个参数。
如何向函数传递多个参数。
如何让函数向调用者返回一个值。
测试题
使用哪个关键字来创建函数?
如何调用函数?
如何向函数传递信息(参数)?
函数最好可以有多少个参数?
如何多函数返回信息?
动手试一试
编写一个函数,用大写字母打印你的名字,就像这样:
编写一个程序多次调用这个函数。
建立一个函数,可以打印全世界任何人名、地址、街道、城市、州或省、邮政编码和国家。(提示:这需要7个参数。可以把它们作为单独的参数传入,也可以作为一个列表。)
编写一个函数计算零钱的总面值,包括五分币、二分币和一分币。函数应当返回这些硬币的总面值。然后编写一个程序调用这个函数。程序运行时应当得到类似下面的输出:
领取专属 10元无门槛券
私享最新 技术干货