第4章函数
概述在程序设计过程中,有很多操作的功能是非常相似甚至完全相同的。当然,可以把代码块复制到不同位置,但如果这段代码需要进行纠错或修改则会遇到很大困难,使代码间的关系更加负责,很可能在修补旧漏洞的同时又引入了新漏洞。那么,只编写一个通用的代码然后重复使用会不会更好呢?此时可以定义一个函数,这样可以创建可重用代码。功能封装为函数递归函数的参数函数装饰器调用函数变量的作用域定义函数函数的定义lambda表达式生成器
目录3第一节:函数的定义第二节:定义函数第三节:调用函数第四节:变量的作用域第五节:函数的参数第六节:返回多个值第七节:将功能封装为函数第八节:递归第九节:使用递归解决问题第十节:lambda表达式第十一节:生成器第十二节:函数装饰器
第一节函数的定义
5函数的定义函数是为实现一个操作而集合在一起的语句集。函数不仅可以实现代码的复用,还可以保证代码的一致性。在前面的章节中,我们已经学习了如何调用一些函数。例如,当调用math.sin(x)时,系统会执行函数中的语句并返回结果。在本章中,我们会学习如何自己定义和使用函数以及如何应用函数去解决复杂的问题。
第二节定义函数
7定义函数函数体包含一个语句的集合,是函数做执行的具体内容。例如,图4-1中的max函数在函数体中通过一个选择结构来判断两个参数中哪个更大并返回这个数的值。某些函数有返回值,也有一些函数没有返回值。使用带关键字return的语句可以使函数返回一个值。执行return语句意味着函数的终止。定义一个函数的语法如下:def函数名(参数列表):函数体例如,可以定义一个函数来找出两个数中比较大的那一个。这里将这个函数命名为max,函数有两个参数,函数返回较大的数。图4-1显示了这个函数的定义并标注了各个部分。函数的定义包括函数头和函数体两部分。函数头以def关键字开始,其后必须跟着函数名和形参列表,并以冒号结束。函数头中的参数被称为形式参数(简称形参)。函数可以有0到多个参数。即使函数中没有参数,也需要保留括号。
第三节调用函数
9调用函数函数的定义用来说明函数要做什么。为了使用函数,必须调用它。在前几章中已经尝试过调用某些内置函数和模块函数。对于一个函数,可以通过“函数名(实参列表)”这样的语法来调用函数。1如果函数有返回值,则可以在函数调用的同时将返回值传递出来,此时这个函数调用可以当作一个值来处理。例如,当调用系统内置函数abs时,可以使用赋值运算符和一个变量来存储这个值:2number=abs(-1)也可以将这个函数直接放在其他表达式或语句中进行运算,例如:abs(pow(-2,3))print(abs(-1)*3+pow(2,2))3调用函数
10代码清单4-1maxFunction.py defmax(a,b):#定义max函数? ???ifab:3? ?????resu=a4? ???lse:5? ???????sult=b6? ???????returnresult7? defn():#定义main函数9? ???x=110? y=211? ???z=max(x,y)#main函数中调用max函数12? print(Thelargernumberof,x,an调用函数
11当程序执行到函数调用语句时,程序的控制权就会被转移到被调用的函数上。当函数执行完毕后(执行完最后一行或遇到return语句),程序将控制权交还给调用者。在代码清单4-1中,解释器逐行读取代码文件。当读到第1~6行和第8~12行的函数时,会记录函数原型,但此时不会让函数执行。当解释器读取到第14行时,执行调用main函数,此时程序控制转移到main函数,跳转到第8行执行。程序执行到main函数中后会先执行变量x和y的两条赋值语句,再在第11行执行调用函数max(x,y),此时程序控制转移到max函数,跳转到第1行。当程序跳转到max函数执行时,x的值会传递给形参a,y的值会传递给形参b,然后程序跳转到max函数内部执行。当max函数的return语句执行完毕之后,max函数会将程序控制转移给调用者(此例中是main函数),并且解释器继续执行第11行的赋值运算,将函数的返回值赋给z。调用函数
第四节变量的作用域
变量的作用域13变量的作用域指的是该变量可以在程序中被引用的范围。本节将讨论在函数范围中变量的作用域。在函数内部定义的变量称为局部变量。局部变量只能在函数内部被访问,其作用域从创建变量的地方开始,到包含该局部变量的函数结束为止OAL
变量的作用域14在所有函数之外创建的变量被称为