购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.3 函数

函数是组织好的一段可以重复多次调用的代码,可以通过传入参数值返回结果,也可以不传入参数直接运行。Python提供了许多内置函数,如print(),用户还可以自定义函数。Python的函数有许多特性,下面将一一介绍。

2.3.1 自定义函数

用户想要实现需要的功能,可以自定义函数。

语法格式如下:

自定义一个函数有以下几点规则。

1.函数代码块以def关键词开头,函数名可以是字母、数字或下划线组成的字符串,但不能以数字开头。

2.函数的参数放在一对圆括号中,此处的参数为形参,参数的个数可以有一个或多个,参数之间用逗号隔开,参数赋值是可选的,括号后面以冒号结束,冒号下面就是函数的主体。

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

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

下面看一个例子,创建一个mytest.py,函数名为printmy,参数只有一个str,函数主体为print(str),返回值为None,代码如下:

函数的调用采用函数名加一对圆括号的方式,圆括号内的参数是传递给函数的具体值,也就是实参,函数调用中的实参列表分别与函数定义中的形参列表对应。格式如下。

调用函数printmy代码如下:

上述代码运行的结果为“我们一起学函数”。

温馨提示

实参必须与形参一一对应,顺序和类型必须一致,否则会出现错误。如果参数提供默认值,顺序可以不一致。

2.3.2 函数的参数

Python的参数类型一共有5种:var_positional、var_keyword、positional_or_keyword、keyword_only、positional_only,其中前4种比较常用。

1.var positional参数类型

参数类型为var_positional,即*args参数,只能通过位置传值,示例代码如下:

上述代码运行的结果为“hello('Jack','Tom')”。

2.var keyword参数类型

参数类型为var_keyword,即**kwargs参数,只能通过关键字传值,示例代码如下:

上述代码运行的结果为“{'a':1,'b':2}”。

3.positional or keyword参数类型

参数类型为positional_or_keyword,说明此参数前面没有var_positional类型的参数,可以通过位置或关键字传值,示例代码如下:

上述代码运行的结果为“hello Jack”“hello Tom”。

4.keyword only参数类型

参数类型为keyword_only,说明此参数前面存在var_positional类型的参数,只能通过关键字传值,示例代码如下:

上述代码运行的结果为“('test',)1 2”。

2.3.3 函数的返回值

使用return语句得到函数的返回值,return可以用变量也可以用表达式。示例代码如下:

上述代码运行的结果为“7”。

如果一个函数有多个return语句,只会返回1个return语句的值。有两种情况,顺序结构返回第1个return语句的值;选择结构则根据条件返回对应的return的值。示例代码如下:

上述代码运行的结果为“>5或<=5”。

无论定义返回什么类型,return返回的只会是单值,但可以存在多个元素。return[1,3,5]是指返回一个列表,是一个列表对象,1、3、5分别是这个列表的元素。return[1,3,5]看似返回多个值,隐式地被Python封装成了一个元组返回。

温馨提示

函数体中没有return语句时,函数运行结束会隐含返回一个None作为返回值。

2.3.4 函数的嵌套

C、C++的函数嵌套只允许函数体内嵌套,而Python的函数嵌套很灵活,不仅支持函数体内嵌套,还支持函数定义嵌套。例如,计算表达式(X 1 +X 2 )/(X 1 -X 2 ),我们可以先计算sum=X 1 +X 2 ,然后计算subtr=X 1 -X 2 ,最后计算这两个表达式相除以后的商值,如图2-3所示。

图2-3 函数的嵌套

示例代码如下:

上述代码运行的结果为“3.0”。

把上面的代码换成函数体内嵌套形式,代码则如下:

上述代码运行的结果为“3.0”。

2.3.5 递归函数

所谓递归函数就是在函数内部调用函数本身,这个函数就是递归函数。递归函数的优点是定义简单,逻辑清晰。理论上,递归函数可以写成循环的方式,但循环的逻辑不如递归清晰。

例如要计算阶乘n!=1×2×3×……×(n-1)×n,可以用while循环方式计算。

上述代码运行的结果为“720”。

计算阶乘还可以用递归函数的方式来实现。当“n>1”的时候,“func()=n!=1×2×3×……×(n-1)×n”可以换成“func()=func(n-1)×n”,递归过程如图2-4所示。

图2-4 阶乘6!递归演示过程图

示例代码如下:

上述代码运行的结果为“720”。

2.3.6 Lambda函数

前面讲到函数的定义是通过def得到的,在Python中有一种不需要def就能定义的函数,即匿名函数,也就是Lambda函数。

Lambda函数语法格式如下:

其中变量列表用于表达式的计算,通常会把Lambda赋值给一个变量,这个变量func就可以作为函数使用。示例代码如下:

上述代码运行的结果为“3.0”。

温馨提示

Lambda中只能使用表达式,不能使用判断和循环。

2.3.7 Generator函数

Generator函数就是一个生成器,一次生成一个数据项,它和普通的函数一样,只是在函数内部使用了yield,它可以实现在for循环中遍历,也能使用next()方法获得yield生成的数据项。

语法格式如下:

用for循环实现,示例代码如下:

上述代码运行的结果为“0 1 2 3 4”。

以上代码实现效果还可以用next()方法实现,示例代码如下:

上述代码运行的结果为“0 1 2 3 4”。 YbvW3nMLvsV9hC7DYDyc699oC3SZlEZhQs+8eU593gjKgvRwo/pqYZi1T7KTa42i

点击中间区域
呼出菜单
上一章
目录
下一章
×