第七章函数
7.1函数的概念
•
函数可以理解为实现某种功能的代码块,这样当程序中需要这个功能时就可以直接调用,而不必每次都编写一次。这就好比生活中使用计算器来计算,当需要计算时,直接使用计算器输入要计算的数,计算完成后显示计算结果,而不必每次计算都通过手写演算出结果。
•
在程序中,如果需要多次输出“拼搏到无能为力,坚持到感动自己
!”
,则可以将这个功能写成函数,具体示例如下:
def output():
print('好的')
•
该条语句可以多次使用。函数使减少代码冗余成为现实,并为代码维护节省了不少力气。
•
Python
中的函数分为内建函数和自定义函数。内建函数是
Python
自带的,即可以直接使用,如
print()
函数、
input()
函数等。常见的内建函数如表所示,本章主要介绍自定义函数。
内建函数的数量是有限的,如果大家想自己设计符合使用需求的函数,则可以定义一个函数,其语法格式如下:
•在上述语法格式中,需注意以下几点:
•
def
(即
define
,定义)为关键字,表示定义一个函数。
•
函数名是一个标识符,注意不能与关键字重名。
•
小括号之间可以用于定义参数,参数是可选的,但小括号不可少。
•
函数体以冒号起始,并且缩进。
•
函数体的第一行语句可以选择性地使用文档字符串用来存放函数说明。
•
return [
表达式
]
结束函数,将表达式的值返回给调用者,也可以省略。
7.2函数的定义
•
接下来演示一个简单的自定义函数,如例所示。
•
在例中,第
2~7
行为文档字符串,初学者在初学阶段只需了解即可。若想查看一个函数的文档字符串,则可以通过
__doc__
属性,如第
11
行所示。关于自定义函数
sum2num()
的解释,如图所示。
•定义函数后,就相当于有了一个具有某些功能的代码。如果想让程序执行这些代码,则需要调用之前定义的函数,其语法格式如下:
•
在例中,求
3
与
4
的和时,则可以通过以下语句实现:
7.3函数的参数
•
参数列表由一系列参数组成,并用逗号隔开。在调用函数时,如果需要向函数传递参数,则被传入的参数称为实参,而函数定义时的参数称为形参,实参与形参之间可以传递数据
7.3.1:位置参数:
•
位置参数是指函数调用时传递实参的顺序与定义函数的形参顺序一致,如例所示。
•
在例中,第
1
、
2
行定义
printInfo
()
函数。第
3
行调用该函数,其数据传递如图所示。第
4
行将两个实参的位置调换,则发生错误。
•
在图中,当函数调用时,实参的传递顺序与定义函数形参的顺序需保持一致。由于实参的顺序与函数定义时形参的位置有关,因此称为位置参数。
7.3.2关键参数
•关键参数是指通过对形参赋值传递的参数。关键参数允许函数调用时传递实参的顺序与定义函数的形参顺序不一致,因为 Python解释器能够用形参名匹配实参值,使用户不必记住位置参 数的顺序,如例所示。
•运行结果如图所示。
•在例中,第3行调用函数时,由于定义函数时形参school有默认值'千锋教育',因此调用时可以省略不写该参数。如果想修改默认值,则在调用时传入该参数即可,如本例中的第4行。
7.3.3默认路径
•
默认参数可以让函数的调用更加简化,就如同安装
PC
端软件时,程序会提示用户默认安装路径,当然用户也可以自定义安装路径。
•
此外,如果将例题中的
name
与
school
调换位置,具体示例如下:
7.3.4不定长路径
•在前面对函数的介绍中,一个形参只能接收一个实参。除此之外,函数形参可以接收不定个数的实参,即用户可以给函数提供可变长度的参数,这可以通过在形参前面使用*来实现,如 例所示
此外,不定长参数还可以接受关键参数并将其存放到字典中,这时需要使用**来实现,如例所示
•此外,通过*还可以进行相反的操作,如例所示。
•另外,通过**可以将字典转换为关键参数,如例所示。
•此外,需注意上述两种方式的传递顺序,如例所示。
7.3.5 传递不可变与可变对象
•
在
Python
中,数字、字符串与元组是不可变类型,而列表、字典是可变类型,两者区别如下:
•
不可变类型
——
该类型的对象所代表的值不能被改变。当改变某个变量时,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。
•
可变类型
——
该类型的对象所代表的值可以被改变。变量改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟出新的地址。
•
接下来演示调用函数时传递不可变与不可变对象,如例所示。
•
运行结果如图所示。
7.4函数的返回值
•
函数调用时的参数传递实现了从函数外部向函数内部输入数据,而函数的
return
语句实现了从函数内部向函数外部输出数据。
•
此处需注意,如果函数定义时省略
return
语句或者只有
return
而没有返回值,则
Python
将认为该函数以“
return None”
结束,
None
代表没有值,如例所示。
•
return
语句可以放置在函数中任何位置,当执行到第一个
return
语句时,程序返回到调用程序处接着执行,此时不会执行该函数中
return
语句后的代码,如例所示。
7.5间接调用函数
前面调用函数时,使用函数名加参数列表的形式调用。除此之外,还可以将函数名赋值给一个变量,再通过变量名加参数列表的形式间接调用函数,例如:
间接调用有何用?这种用法可以使一个函数作为另一个函数的参数,例如:
另外,函数名还可以作为其他数据类型的元素,例如:
匿名函数是指没有函数名称的,临时使用的微函数。他可以通过lambdda表达式来声明,其语法格式如下: