- Python程序设计
- 张雪萍主编
- 2393字
- 2020-08-27 23:59:43
1.6 函数
函数是程序中可重复使用的代码段,用来实现单一的或相关联的功能。
可以给一段程序起一个名字,用这个名字来执行一个操作,反复使用(调用函数),这就是函数的基本含义。
基本上所有的高级语言都支持函数,Python也不例外。Python不但能非常灵活地定义函数,而且本身内置了很多有用的函数,可以直接调用,如用于输入输出的函数input()、print()等。除此之外,我们也可以创建函数,即用户自定义函数。
Python中的函数分3类。
(1)自定义函数:由程序员自己编写的函数。
(2)标准库函数:通过import指令调用标准库,然后使用其函数。
(3)内置函数:如前面介绍的input()、print()、eval()等函数。
下面主要介绍自定义函数和函数参数传递等相关知识。
1.6.1 函数的定义
1.自定义函数的语法格式
说明:
(1)函数使用关键字(保留字)def声明。注意:“def”只能是小写字母!
(2)函数名必须使用有效的标识符(以字母或下划线开头的字母数字串,只能以字母或下划线开头)。
(3)参数列表中的参数为形式参数,多个参数之间用逗号隔开(可以没有参数,此时称为无参函数,即使没有参数,小括号也不能省略)。
(4)函数可以使用 return 返回值,若函数体中包含 return 语句,则返回值,可以返回一个值,也可以返回多个值(实际上返回的是元组);如果没有return或者return后无返回表达式,则都返回“None”。
(5)通常使用三个单引号'''…'''来注释说明函数的作用。函数体里的内容不可为空,如果想定义一个什么都不做的空函数,可用 pass 语句。空语句 pass 起占位的作用,经常会在刚开始定义函数的时候用它来占位,今后进行具体操作的时候再来进行修改。
上述代码中,缺少pass空语句会出错。
2.自定义函数的示例
【例1-23】 没有参数和返回值的函数。
当调用 help(say_hi)时,可以查看自定义函数中用三引号注释的内容(用#注释的内容无法查看)。
【例1-24】 用help(say_hi)查看自定义函数的注释内容。
注意:Python 是一门完全依赖于缩进的语言!它不用分号等作为每个语句的结束。
【例1-25】 请写出一个自定义函数,用来求一个数的平方。
输出语句不要放在自定义函数中,每个模块只实现一个功能就好。
如果在上面的例子中,把自定义函数体中的 return 语句进行如下修改,请观察得到的结果。
如果return后无表达式,则返回的是“None”空类型。
如果自定义函数中无return语句,则返回的还是“None”空类型。
3.Python中函数和方法的异同点
函数可以看成一个数学上的概念,比如说完成加、减、乘、除的函数。它其实有一个内在的约束,就是如果参数相同,对一个函数的每次调用返回的结果应该始终是一样的。
方法是与某个对象相互关联的,也就是说它的实现与某个对象有关联关系。方法的定义方式和函数是一样的,在Class中定义的函数就是方法。
1.6.2 函数的调用
1.函数调用的语法格式
说明:
(1)函数名是已经定义好的函数名称,即遵循先定义后使用的原则。
(2)调用函数的实参列表必须与定义函数时的形参列表一一对应,包括参数的个数、类型等,否则程序会报错。
2.参数传递
1)默认参数
如果在定义函数的时候,指定了参数的值,而在调用函数时不指明所有参数的值,则没有指明的参数就使用它的默认值。
【例1-26】 默认参数示例。
说明:默认参数后不能再出现非默认参数。示例如下:
(1)f(a,b=2) 这样定义合法!
(2)f(b=2,a) 这样定义非法!因为在默认参数后又出现了非默认参数a。
默认参数指的是在定义函数时指定了值的参数。如上例中,在定义函数 repeat_str(s,times=1)时,指定了参数 times 的值为 1,这时就称参数 times 为默认参数。在参数times后不能再出现非默认参数了!
2)关键字参数
关键字参数,在调用函数时有时希望只给部分参数传值,这时就要用到关键字参数。示例如下:
在上面的示例中,只给参数a、b传值是可以的,此时参数c使用默认值8;但如果要给a、c传值,b使用默认值4,这时就必须使用关键字参数。
关键字参数指的是在调用函数时,明确指明其值的参数,如上面调用函数“func(125,c=24)”时指明了参数c的值为24,这里的参数c就称为关键字参数。由于关键字参数指明了它的值为多少,因此,它的位置就没有那么重要了。
请注意区分这两个概念:默认参数是定义函数时出现在参数表中的参数(形参),而关键字参数是在调用函数时出现在参数表中的参数(实参)。
3.变量作用域
在Python程序中创建、查找变量名时,都是在一个保存变量名的空间中进行的,我们称之为命名空间,也称为作用域。Python 变量的作用域是静态的,在源代码中变量名被赋值的位置决定了该变量能被访问的范围(Python 中的变量不需要定义,在被赋值的时候就创建了一个变量指向值对象)。变量声明的位置不同则被访问的范围不同。变量的作用域分为三种:全局变量、局部变量和类成员变量。这里,我们主要介绍两种最基本的变量作用域,全局变量和局部变量[9]。
1)全局变量和局部变量
定义在函数内部的变量(注意:这里说的是“定义”,而不是一般的“使用”,见下面的示例),只能在其被声明的函数内部被访问。全局变量可以在整个程序范围内被访问,而局部变量只能在某个局部区域范围内被访问。
2)示例
【例1-27】 理解全局变量和局部变量。
在函数内部声明的变量,除非特别声明为全局变量,否则均默认为局部变量。有些情况需要在函数内部定义全局变量,这时可以使用关键字 global 来声明变量的作用域为全局范围。
【例1-28】 利用关键字global在函数内部声明全局变量。
1.6.3 lambda函数
Python 中用户自定义函数有两种方法,第一种是 1.5.1 节介绍的用 def 来定义,这种定义方式要明确指出函数的名字。第二种是通过保留字 lambda 来定义,这种定义方式不需要指定函数名,叫作匿名函数,也称为lambda函数。其语法格式为:
说明:冒号“:”前面是逗号分隔的参数列表,之后的表达式的值是所定义的函数的返回值,由于lambda函数只能返回一个值,所以不用写return。
lambda 函数主要适用于定义简单的、能够在一行内表示的函数,用在函数式编程中时通常省略<函数名>,即支持函数作为参数。请看下面的例子。
【例1-29】 将列表中的元素按照绝对值大小进行排序。
【例1-30】 含单个参数的lambda函数。
【例1-31】 含多个参数的lambda函数。