第5章函数
本章学习目标
•理解函数的概念及分类
•掌握函数的定义和调用方法
•掌握函数传参的2种方式和3类形参的用法
•理解变量的4级作用域,掌握作用域规则
•理解递归函数的概念及用法
•掌握常用的内置函数的调用方法
•掌握d a t e t i m e库的常用类d a t e t i m e的用法
本章主要介绍P y t h o n函数概述㊁函数的基本操作㊁函数的参数和变量的作用域4个内容,同时介绍递归函数和常用的P y t h o n内置函数的用法,穿插讲解一个标准库 d a t e t i m e库的知识㊂
5.1函数概述
本节包括以下两方面内容㊂
①函数的基本概念;
②使用函数编程的目的㊂
5.1.1函数的基本概念
函数是具有特定书写格式㊁可重复使用的,用来实现单一,或相关联功能的代码段,是可以用来构建更大程序的一小部分㊂该代码段用函数名表示并通过函数名进行功能调用㊂可以在需要的地方调用执行,不需要在每个执行的地方重复编写这些语句㊂每次使用函数可以提供不同的参数作为输入,以实现对不同数据的处理;函数执行后,可以反馈相应的处理结果㊂
P y t h o n中的函数,通常分为以下四大类㊂
1.内置函数
P y t h o n提供了许多内置函数,比如前面章节使用的s t r()㊁l i s t()㊁p r i n t()㊁r a n g e()函数等㊂它们是P y t h o n官方已经为程序开发人员设计好的模块化的代码段,可以被反复使用(调用)㊂程序开发人员不需要了解函数的实现代码,只要了解函数的功能㊁参数和调用语法即可直接使用㊂
2.标准库函数
P y t h o n标准库是用P y t h o n和C语言预先编写的模块,提供了系统管理㊁网络通信㊁文本处理㊁数据库接口㊁图形系统㊁X M L处理等额外的功能,如r a n d o m(随机数)㊁m a t h(数学
第5章函数
运算)㊁d a t e t i m e(时间处理)㊁f i l e(文件处理)㊁o s(和操作系统交互)㊁s y s(和解释器交互)等㊂这些模块随着P y t h o n解释器一起自动安装,程序员可以通过i m p o r t语句导入对应功能的库,然后使用其中定义的函数㊂
3.第三方库函数
除了内置函数和标准库函数,还可以获取和安装一些第三方库函数㊂第三方库函数很多是对标准库函
数的优化和再封装,如N u m P y㊁D j a n g o等㊂P y P I(P y t h o nP a c k a g e I n d e x)是P y t h o n官方第三方库的仓库,所有人都可以下载第三方库或上传自己开发的库到P y P I㊂世界各地的程序员通过该开源社区贡献了十几万个第三方函数库,功能覆盖我们能想象到的所有领域,如科学计算㊁W e b开发㊁大数据㊁人工智能㊁图形系统等㊂与标准库不同, P y t h o n的第三方库需要下载后安装到P y t h o n的安装目录下,第三方库的获取和安装将在后续章节介绍㊂安装完成后,再通过i m p o r t语句导入,然后才可以使用这些第三方库函数㊂
4.用户自定义函数
用户自定义函数,是开发中为适应用户自身需求而定义的函数,也是本章介绍的重点内容㊂
5.1.2使用函数编程的目的
使用函数主要有以下4个目的㊂
1.降低代码的复杂性
程序员的目标之一是,编写简单的代码来完成任务,而函数有助于实现这样的目标㊂函数是一种功能抽象,利用它可以将一个复杂的大问题分解成一系列简单的小问题,然后将小问题继续划分成更小的问题,当问题细化到足够简单时,就可以分而治之㊂为了实现这种分而治之的设想,就要通过编写函
数,将各个小问题逐个击破,为每个小问题编写程序,再集合起来,解决大的问题㊂
2.实现代码复用
在编程的过程中,比较忌讳同样一段代码不断重复㊂所以,可以定义一个函数,在程序的多个位置使用,也可以将其用于多个程序㊂需要运行函数中的代码时,只需编写一行函数调用代码,就可让函数完成其工作㊂当然,还可以把功能相近的函数放到一个模块中供其他程序员使用㊂也可以使用其他程序员定义的函数,这就避免了重复劳动,提高了工作效率㊂
3.降低代码维护的工作量
修改函数的功能时,只需要在函数中修改一次,所有调用位置的功能都将得到更新㊂函数式程序的测试和调试相对来说更容易㊂调试很简单是因为函数通常都很小,而且清晰㊁明确㊂当程序无法工作的时候,每个函数都是一个可以检查数据是否正确的接入点㊂程序员可以通过查看中间输入和输出迅速到出错的函数㊂测试更容易是因为每个函数都是单元测试的潜在目标㊂在执行测试前,函数并不依赖于需要重现的系统状态;相反,程序员只需要给出正确的输入,然后检查输出是否和期望的结果一致㊂
4.增加程序的易读性
使用函数让程序更容易阅读,而良好的函数名概述了程序各个部分的作用㊂相对于阅读一系列的代码块,阅读一系列函数调用能够让使用者更快地明白程序的作用㊂
㊃321㊃
P y t h o n程序设计 以医药数据处理为例
5.2函数的基本操作
本节包括以下4个内容㊂
①函数的定义;
②函数的返回值;
③函数的调用;
④l a m b d a表达式和匿名函数㊂
5.2.1函数的定义
P y t h o n定义函数的语法形式如下㊂
def<;函数名>([形式参数列表]):
'''文档字符串'''
<;函数体>
[return[返回值列表]]
说明:
①d e f是定义函数的关键字,这个简写来自英文单词d e f i n e㊂P y t h o n执行d e f时,会创建一个函数对象,并绑定到函数名变量上㊂函数名可以是任何有效的P y t h o n标识符㊂函数名通常使用小写字母,如果想提高可读性,可以用下画线分隔㊂大小写混合仅在兼容原来主要以大小写混合风格的情况下使用,为了保持向后兼容性㊂
②函数的形式参数列表用于接收调用该函数时传递给它的值,放在一对圆括号中㊂参数的个数可以有零个㊁一个或多个,多个参数之间用逗号间隔,这种参数称为形式参数,简称为 形参 ㊂函数形参无须声明类型,完全由调用者传递的实参类型以及P y t h o n解释器的理解和推断决定㊂即使该函数无须接收任何参数,也必须保留一对空的圆括号㊂
③括号后面以冒号结束,冒号必须使用英文输入法输入,否则会提示S y n t a x E r r o r 异常㊂
④冒号后面所有的缩进行构成了函数体㊂函数体是函数每次被调用时执行的代码,由一行或多行语句组成㊂函数体相对于d e f关键字必须保持一定的缩进㊂
⑤程序的可读性非常重要,一般建议在函数体开始的部分附上函数定义说明,即文档字符串(d o c s t r i n g),又称为 函数注释 ㊂通过3个单引号或者3个双引号界定,中间可以加入多行文字进行说明,描述函数的功能或用途㊂P y t h o n使用它们生成有关程序中函数的文档㊂需要注意的是,P y t h o nP E P8编码规范中约定,对于单行的文档说明,尾部的三引号应该和文档在同一行㊂多行文档说明使用的结尾三引号应该自成一行㊂
⑥当需要返回值时,使用关键字r e t u r n和返回值列表,执行r e t u r n语句会结束对函数的调用,并带回返回值㊂否则,函数可以没有r e t u r n语句,在函数体结束位置将控制权返回给调用者㊂例如,4.5.3节的微实例4.6讲述了如何用辗转相除法求任意两个整数的最大公约数㊂为了实现代码复用,
可以将该功能定义成g c d()函数,需要时直接调用该函数,即可实现求任意两个正整数的最大公约数,程序代码如下所示㊂
㊃421㊃
第5章函数
>>>def gcd(m,n):
'''求任意两个正整数的最大公约数'''
while m%n:
m,n=n,m%n
return n
>>>print(gcd.__doc__)
求任意两个正整数的最大公约数
>>>x,y=12,16
>>>print("两个数的最大公约数是:{}".format(gcd(x,y)))
两个数的最大公约数是:4
>>>print(type(gcd),type(gcd(x,y)))
<class'function'><class'int'>
5.2.2节将会详细讲述r e t u r n语句的相关语法㊂
⑦定义函数时只检测语法,不执行函数体代码㊂定义好的函数只有被调用的时候才会执行函数体代码㊂
⑧P y t h o n允许嵌套定义函数,即在一个函数的定义中再定义另一个函数,该操作称为 闭包 ㊂除非特别必要,一般不建议过多使用嵌套定义函数,因为每次调用外部函数时,都会重新定义内层函数,
程序运行效率较低,如下述代码所示㊂
python处理xml文件def f1():
print('')
def f2():
print('')
f2()
f1()
运行该程序,结果如下所示㊂
<
<
在函数的内部嵌套定义函数时,内部函数的定义和调用都要在该函数的内部完成㊂上
例中,函数f2()定义在函数f1()内部,函数f2()的定义和调用都必须在函数f1()内部㊂如果在函数f1()外部调用函数f2(),则会提示N a m e E r r o r异常,如下述代码所示㊂def f1():
print('')
def f2():
print('')
f2()
运行该程序,结果如下所示㊂
NameError:name'f2'is not defined
㊃521㊃
P y t h o n程序设计 以医药数据处理为例
5.2.2函数的返回值
P y t h o n中,用d e f关键字定义函数时,函数并非总是直接显示输出,相反,它可以处理一些数据,并返回一个或一组值㊂函数返回的值被称为返回值㊂在函数中,可使用r e t u r n 语句将值返回到函数调用处㊂通过返回值,能够实现将程序的大部分繁重工作转移至函数中完成,从而简化主程序㊂r e t u r n语句的语法形式如下㊂
return[返回值列表]
说明:
①返回值可以是任意类型,r e t u r n语句在同一函数中可以出现多次,但只要有一个r e t u r n语句执行,就会直接结束当前函数的执行㊂
②一条r e t u r n语句也可以同时带回一个或多个返回值,多个值以元组方式返回,如下述代码所示㊂
>>>def median(*data):
data=sorted(data)
number=len(data)
if number%2==0:
return data[number//2-1],data[number//2]#带回多个返回值else:
return data[number//2]#带回一个返回值
>>>median(1,8,5,4,9)
5
>>>median(1000,100,10,1)
(10,100)
③对于以下3种情况,P y t h o n将认为该函数以r e t u r nN o n e语句结束,即返回空值㊂
•若函数内没有r e t u r n语句,P y t h o n解释器将默认为函数体最后添加了一条r e t u r n N o n e语句㊂
本书实例经常使用p r i n t()函数输出数据,其实该函数的返回值就是N o n e㊂因为它的功能是在屏幕上显示文本,根本不需要返回任何值,所以p r i n t()函数就返回N o n e,如下述代码所示㊂
>>>demon=print("China Pharmaceutical University")
China Pharmaceutical University
>>>demon==None
True
•函数内有r e t u r n语句,但是没有执行到㊂
•函数内有r e t u r n语句,也执行到了,但r e t u r n语句后面的表达式列表省略,即当前
代码行只有r e t u r n关键字本身㊂
需要特别说明的是,N o n e(N必须大写)是P y t h o n中一个特殊的常量,和F a l s e不同,它
㊃621㊃
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论