- 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.自定义函数的语法格式
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/54_2.jpg?sign=1738943653-8a0h9D6IYR4qkD7YR8M9YX08UFnFIS6e-0-64c761f81c8f57dbb34a2064bd1bd344)
说明:
(1)函数使用关键字(保留字)def声明。注意:“def”只能是小写字母!
(2)函数名必须使用有效的标识符(以字母或下划线开头的字母数字串,只能以字母或下划线开头)。
(3)参数列表中的参数为形式参数,多个参数之间用逗号隔开(可以没有参数,此时称为无参函数,即使没有参数,小括号也不能省略)。
(4)函数可以使用 return 返回值,若函数体中包含 return 语句,则返回值,可以返回一个值,也可以返回多个值(实际上返回的是元组);如果没有return或者return后无返回表达式,则都返回“None”。
(5)通常使用三个单引号'''…'''来注释说明函数的作用。函数体里的内容不可为空,如果想定义一个什么都不做的空函数,可用 pass 语句。空语句 pass 起占位的作用,经常会在刚开始定义函数的时候用它来占位,今后进行具体操作的时候再来进行修改。
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/55_1.jpg?sign=1738943653-20Wgg8iVyrbTiiPvmyY4VS14n0MU9ORv-0-f5b024b2ea0363e840eae18f11ea2e57)
上述代码中,缺少pass空语句会出错。
2.自定义函数的示例
【例1-23】 没有参数和返回值的函数。
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/55_2.jpg?sign=1738943653-TGDWEXyi0IdAQpEW0NAO7BGKU94YS6zj-0-7364798e36d663c90fbeaf3788e89f8b)
当调用 help(say_hi)时,可以查看自定义函数中用三引号注释的内容(用#注释的内容无法查看)。
【例1-24】 用help(say_hi)查看自定义函数的注释内容。
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/55_3.jpg?sign=1738943653-QE0rCQrBTROx3VG6WkoPQxUVpukE7H6q-0-0991c00753b4416935a6c61cd1165dba)
注意:Python 是一门完全依赖于缩进的语言!它不用分号等作为每个语句的结束。
【例1-25】 请写出一个自定义函数,用来求一个数的平方。
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/55_4.jpg?sign=1738943653-1CbvH4Djc1Nixhiw8754zwbSxWCG9aVT-0-0edb66c733949eaa3424f11260c43784)
输出语句不要放在自定义函数中,每个模块只实现一个功能就好。
如果在上面的例子中,把自定义函数体中的 return 语句进行如下修改,请观察得到的结果。
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/56_1.jpg?sign=1738943653-NwtWAkRTxD6KJzXX6O6c5cykIpN1W6rg-0-2efcc36731353b3b8d8b9d2b269dcf45)
如果return后无表达式,则返回的是“None”空类型。
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/56_2.jpg?sign=1738943653-nJ4g2acuYyusVxmr6WDzszGg72SzaGsK-0-b1759fb9be7a31fc08d8f8e3bddca2a8)
如果自定义函数中无return语句,则返回的还是“None”空类型。
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/56_3.jpg?sign=1738943653-ZXr1aHVue3RxYeV9wmhmhFWJWr2okfK9-0-8bc3251e9c41d6dbaa1edb2c7101af26)
3.Python中函数和方法的异同点
函数可以看成一个数学上的概念,比如说完成加、减、乘、除的函数。它其实有一个内在的约束,就是如果参数相同,对一个函数的每次调用返回的结果应该始终是一样的。
方法是与某个对象相互关联的,也就是说它的实现与某个对象有关联关系。方法的定义方式和函数是一样的,在Class中定义的函数就是方法。
1.6.2 函数的调用
1.函数调用的语法格式
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/56_4.jpg?sign=1738943653-NQ09lMCKq9ljFria6c4rJhMx9TlH7gcd-0-31b6f20cf8adf2624c1c84b43578ac97)
说明:
(1)函数名是已经定义好的函数名称,即遵循先定义后使用的原则。
(2)调用函数的实参列表必须与定义函数时的形参列表一一对应,包括参数的个数、类型等,否则程序会报错。
2.参数传递
1)默认参数
如果在定义函数的时候,指定了参数的值,而在调用函数时不指明所有参数的值,则没有指明的参数就使用它的默认值。
【例1-26】 默认参数示例。
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/57_1.jpg?sign=1738943653-RLYn8YEH3lr8qPjixtcgMxs7iKJXwCuu-0-62624894053d64ec2d858b6ca593e851)
说明:默认参数后不能再出现非默认参数。示例如下:
(1)f(a,b=2) 这样定义合法!
(2)f(b=2,a) 这样定义非法!因为在默认参数后又出现了非默认参数a。
默认参数指的是在定义函数时指定了值的参数。如上例中,在定义函数 repeat_str(s,times=1)时,指定了参数 times 的值为 1,这时就称参数 times 为默认参数。在参数times后不能再出现非默认参数了!
2)关键字参数
关键字参数,在调用函数时有时希望只给部分参数传值,这时就要用到关键字参数。示例如下:
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/57_2.jpg?sign=1738943653-MV2WZhmGFUAZLUMSDY8OzrmHo5Ye8Xtt-0-d6877f67395e090cb16572c2f2d013ab)
在上面的示例中,只给参数a、b传值是可以的,此时参数c使用默认值8;但如果要给a、c传值,b使用默认值4,这时就必须使用关键字参数。
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/57_3.jpg?sign=1738943653-XnulMQDYvcYg5DTQ0tC11L69eLvPWICG-0-c05ce2be79873794700dc1eddd703d79)
关键字参数指的是在调用函数时,明确指明其值的参数,如上面调用函数“func(125,c=24)”时指明了参数c的值为24,这里的参数c就称为关键字参数。由于关键字参数指明了它的值为多少,因此,它的位置就没有那么重要了。
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/57_4.jpg?sign=1738943653-LgKnMbnlKmFbvhD5oyx88tqQYOYWvUTb-0-fe081f8bb59567bff2c1356cedeae377)
请注意区分这两个概念:默认参数是定义函数时出现在参数表中的参数(形参),而关键字参数是在调用函数时出现在参数表中的参数(实参)。
3.变量作用域
在Python程序中创建、查找变量名时,都是在一个保存变量名的空间中进行的,我们称之为命名空间,也称为作用域。Python 变量的作用域是静态的,在源代码中变量名被赋值的位置决定了该变量能被访问的范围(Python 中的变量不需要定义,在被赋值的时候就创建了一个变量指向值对象)。变量声明的位置不同则被访问的范围不同。变量的作用域分为三种:全局变量、局部变量和类成员变量。这里,我们主要介绍两种最基本的变量作用域,全局变量和局部变量[9]。
1)全局变量和局部变量
定义在函数内部的变量(注意:这里说的是“定义”,而不是一般的“使用”,见下面的示例),只能在其被声明的函数内部被访问。全局变量可以在整个程序范围内被访问,而局部变量只能在某个局部区域范围内被访问。
2)示例
【例1-27】 理解全局变量和局部变量。
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/58_1.jpg?sign=1738943653-5FMBSmJY0eEUOFq2cpj3tfZhiAjbM8e2-0-6eba96a290b710952cc0e1b66f75b29b)
在函数内部声明的变量,除非特别声明为全局变量,否则均默认为局部变量。有些情况需要在函数内部定义全局变量,这时可以使用关键字 global 来声明变量的作用域为全局范围。
【例1-28】 利用关键字global在函数内部声明全局变量。
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/58_2.jpg?sign=1738943653-gXHISBzHZSmrFqIcP1YMsnaMvn2voXLB-0-31c4cf461614df061ffcd667a58ddeac)
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/59_1.jpg?sign=1738943653-N4fBe3UNtFL1UNP3jDhCM1cYpqIsbFV0-0-460e7febe513a0d5ceaa1028125f94e7)
1.6.3 lambda函数
Python 中用户自定义函数有两种方法,第一种是 1.5.1 节介绍的用 def 来定义,这种定义方式要明确指出函数的名字。第二种是通过保留字 lambda 来定义,这种定义方式不需要指定函数名,叫作匿名函数,也称为lambda函数。其语法格式为:
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/59_2.jpg?sign=1738943653-vuXYmzVvnJT3qKVd5FNu7pmX6euMbP4I-0-7435d82609af93c8196b5daa5f1a993f)
说明:冒号“:”前面是逗号分隔的参数列表,之后的表达式的值是所定义的函数的返回值,由于lambda函数只能返回一个值,所以不用写return。
lambda 函数主要适用于定义简单的、能够在一行内表示的函数,用在函数式编程中时通常省略<函数名>,即支持函数作为参数。请看下面的例子。
【例1-29】 将列表中的元素按照绝对值大小进行排序。
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/59_3.jpg?sign=1738943653-fEJbZXDla9dlPE5f7i1bk0HVjS1kXYVn-0-4d2aeceea1d879b2ac9e8a02aa921c0c)
【例1-30】 含单个参数的lambda函数。
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/59_4.jpg?sign=1738943653-ROBFC7okvTjHshnxXkDe1S7cZtK0250h-0-8e876f2cd72a99298a6dc0611aa808d2)
【例1-31】 含多个参数的lambda函数。
![](https://epubservercos.yuewen.com/ED6D45/13898202805418106/epubprivate/OEBPS/Images/59_5.jpg?sign=1738943653-xluo5ghQYJEhCOTmmDbFZFLrP9KLr8zn-0-778a6eda45f9541f6f1d6c2f4657e0e7)