函 数

函 数

在函数这一部分,我们将介绍如何使用系统自带的内置函数,以及如何定义自己的函数等。

使用系统已有的工具——调用系统内置函数

Python在安装好之后,提供了很多类似钳子、锤子、剪刀的工具——函数。这样用户就可以方便地从“工具箱”中直接取工具来使用,当然要注意使用规范,要不然程序就会报错。在前面的例子中,我们已经使用了一个函数名为print的内置函数,当时采用的是一个参数的形式,如:

也可以采用多个参数的形式,如:

运行结果为:a=3。

参数可以理解为函数的输入,是否有输出值取决于函数的定义,上面程序中的函数print()就没有输出值。而如果在函数的定义中需要返回某个值,如对一个数进行四舍五入的函数round()就有输出值,即将一个数四舍五入后的值进行输出。

上面的程序将函数的结果赋给变量c,输出结果是“c=4”。

在使用函数时,是否需要填入参数,这取决于它的定义,需要按照函数所能接受的,即符合定义规定的数据类型和参数个数来调用函数。正如一个面包机,如果放入的不是面粉、酵母,而是大米,就无法得到正确的结果。

因此,要调用一个函数,需要知道函数的名称和参数,可以直接从Python的官方网站查看文档:http://docs.python.org/3/library/functions.html。

表4-1给出了一些常用的系统函数名。

表4-1 常用系统函数名

对于用户来说,要记住这些函数名并不是件容易的事,也没有必要。可以在需要使用某个功能时,搜索是否有相应的函数可以完成这个功能,然后再对照这个函数的参数说明和应用实例来进行使用。例如,我们想求取几个数的最大值,可以尝试在搜索引擎上搜索“求最大值函数Python”,就可以看到相应的搜索结果中提示使用max()函数,同时查到max()是可以放入任意多个参数且有返回值的函数,如:

输出结果为:

自己创造工具——定义自己的函数

系统往往提供一些通用的工具,我们也可以搭建自己的工具,就像玩积木一样,只要按照一定的规则来,也可以创造个性化的产品。就是说用户也可以自己创建函数,用户自己创建的函数被称为用户自定义函数。定义一个自己的函数需要符合一定的语法规则,通过前面调用函数的过程,我们可知,函数至少具备几个主要的内容:函数名、是否有参数(在圆括号中)、对参数的操作(函数体)、是否有返回值(return)。下面我们先定义一个可以执行“为输入数据加1并打印”操作的函数addone()。

输出结果为:

上例中函数是有返回值的。上例采用“return[表达式]”退出函数,其选择性地向调用方返回一个表达式。不带参数值的return语句返回None。

工具的制作规范——定义函数的基本规则

但是要注意,在制造工具的时候,要符合一定的规范。下面我们初步了解如何定义一个函数,其基本规则如下。

●首先要以def关键词开头,后面跟着函数名以及圆括号,如上例中的“def addone(data):”,addone是函数名或者是函数标识符名,圆括号中是参数。

●任何输入参数和自变量必须放在圆括号中,如“(data)”中的data为参数。

●函数的第一行语句可以选择性地使用文档字符串——用于存放函数说明。

●函数内容以冒号起始,并且缩进(直接采用Tab键缩进)。

●“return[表达式]”结束函数,选择性地返回一个值给调用方。不带表达式的return语句相当于返回None。

函数名的选取按照命名规则来定,一般以字母开头。参数和函数体的设计是最难的部分,是否需要参数,设定几个参数是根据需要来确定的,也就是说如果函数体执行的部分需要从外界输入参数,则需要设定参数,正如照相机需要外界影像信息的输入,面包机需要面粉、水等输入,这些输入往往是可变的量,需要用户在调用时确定;如果函数执行的内容是固定的、不变的,就可以采用无参函数,例如,我们设计一个函数,打印“你好,世界!”,就可以设计为如下形式:

运行结果为:

工具需要加工的原材料——函数中的参数与调用

面包机处理的是面粉,酸奶机处理的是牛奶,函数处理的是数据,如果这个数据需要从外界输入,我们就需要设计参数。

函数的参数有几种形式,例如,最普通的是列出固定的参数,我们调用的时候按照定义的顺序输入相应的数值即可,但这个要求我们必须按照顺序依次输入。因此,Python提供了一种关键字参数,按照关键字输入数据时,只要将数据绑定在关键字上就可以不按照顺序进行输入。此外如果我们不输入数据,程序也有一个默认的值可以操作,例如,我们在Word上编辑文字,默认是白底黑字。最复杂的一种情况是我们需要输入的参数的个数是无法预先知道的,或者说是可变长度的,此时需要设计不定长参数。下面将针对以上几种情况分别进行举例并说明。

1.必备参数

必备参数需以正确的顺序输入函数。调用时的数量必须和声明时的一样。

调用addone()函数,必须输入一个参数,不然会出现语法错误:

以上实例输出结果:

2.关键字参数

如果用户调用函数时不想按照函数参数的顺序填写参数,可以采用关键字方式,即在调用时说明关键字的值是什么。下例中分别采用按顺序赋值和采用关键字的方式,得到相同的结果。

以上实例输出结果:

3.缺省参数(默认参数)

缺省参数是在函数定义时,就给参数一个初始化的值(默认值),调用函数时,缺省参数的值如果没有输入,则被认为是默认值。

以上实例输出结果:

4.不定长参数

有时用户需要的参数个数是变化的,不是固定长度的,因此在函数声明时需要建立一种不定长参数机制,参数设计的基本语法如下:

加了星号(*)的变量名会存放所有未命名的变量参数。不定长参数实例如下:

以上实例输出结果:

原材料出来后还是原来的形态吗?——函数调用输入的对象与参数的关系

在Python中,函数圆括号内的参数是不设计类型的,类型属于在函数调用时填入的实际操作对象,但实际函数体的运算对类型是有要求的,因此在调用中需要查看对象类型的要求。

当一个对象进入函数调用过程中时,如果在函数体内改变了该对象的值,那么在函数调用之后该对象的值是否发生改变了呢?

下面我们来看一个例子:

之后输出a、b的值,可以得出:

可以看出,不同的对象a和b经过函数的操作之后,a的值没有发生变化,而b的值发生改变了。在Python中,字符串、元组和数字是不可更改的对象,而列表和字典等则是可以修改的对象。即如果在函数中修改了这些值,在函数外,只有列表和字典对象的值被改变了。需要强调的是,如果b是一个元组类型,程序会报错,在函数中不允许修改元组类型的对象。

哪些原料可以被使用——变量使用的范围以及变量的作用域

一个原料是否能被工具所使用,取决于它与工具使用时间的先后关系。例如,一个洗衣机已经开始洗衣服了,这时就无法放入新的衣物,衣物应在洗衣机启动之前放入。同样,如果一件衣服已经在洗衣机里了,我们也无法直接获取它。因此,一个变量是否能够被访问,在什么范围内可以被访问,取决于这个变量是在哪里赋值的。这就是变量的作用域,它决定了在哪一部分程序可以访问哪些变量。

两种最基本的变量(全局变量和局部变量)作用域如下。顾名思义,全局变量在程序的任何地方都可以访问,它在函数之外定义,可以在整个程序范围内访问;而局部变量只能在其被声明的函数内部访问。也就是说,在函数中是否可以使用变量,取决于变量与函数声明的先后关系。

var1是全局变量,var2是局部变量。输出结果为:

在函数内部,可以访问var1和var2;而在函数之外,只能访问var1,而不能访问var2。