Python程序设计 课件 第四章 函数_第1页
Python程序设计 课件 第四章 函数_第2页
Python程序设计 课件 第四章 函数_第3页
Python程序设计 课件 第四章 函数_第4页
Python程序设计 课件 第四章 函数_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章

函数Python程序设计01函数的基本使用02参数传递与变量作用域03本章回顾函数函数是可一次定义多次使用的代码段。若把Python类比汉语,函数相当于典故等,能提高代码可读性和开发效率。比如班级有40人,需按固定格式打印个人信息,常需此功能,用函数可定义一次后随时调用。本章将介绍函数基本使用、参数传递、变量作用域等内容。第4章函数4.1函数的基本使用4.1.1函数的定义与调用4.1.2函数的返回值4.1.3Python常用内置函数4.1.4案例5:验证哥德巴赫猜想4.2参数传递与变量作用域4.2.1函数的参数传递4.2.2函数传递的参数分类4.2.3变量作用域4.2.4匿名函数与高阶函数4.2.5案例6:计算某公司销售员工的奖金01函数的基本使用在计算机中,函数是可被引用的程序或代码段,用于实现某种功能且可重复使用。其作用包括通过友好命名让代码易读易调试、减少重复代码使程序更短小且便于后续修改、将长程序拆分为函数方便单独调试后组装。之前使用过的input()、print()、range()等是Python提供的标准内置函数。而我们也可以自己定义函数并使用,本节将学习函数的定义和调用。函数的定义Python中函数的定义使用def关键字实现,具体的语法如下:deffunctionname(parameters):functionbody参数描述functionname用于指定函数名称,在调用函数时使用parameters【可选】用于指定函数参数,如果不指定,则说明该函数没有参数,在调用时也不用传递参数;如有多个参数,参数间使用逗号“,”分隔functionbody【可选】函数体,即在函数被调用时,要执行的功能代码,如果想要定义一个什么都不干的函数,可以使用pass语句占位;如果函数有返回值,可以使用return语句参数说明如表4-1所示。函数的定义接下来我们定义一个打印个人信息的函数,如下图所示。上图中,函数的名称是showinfo,调用时即使用这个名字;小括号“()”中的name、sex和age是函数的参数,用逗号“,”进行分隔;冒号“:”后边的两句代码是函数体,即功能代码,这里就是使用格式化字符串来打印个人信息;此代码没有return语句,代表没有返回值。由于此部分代码只是函数定义,还没有对其进行调用,所以运行此代码没有输出。函数的调用函数的定义是通过参数和函数体决定函数能做什么,但函数并没有被执行。如果想要执行该函数就需要调用函数,如调用图4-1中的函数showinfo的代码为showinfo('张三','男',23),输出结果就是格式化打印“张三”的姓名、性别、年龄信息。调用函数的语法格式为:functionname(parameters_value)functionname是要调用函数的函数名,parameters_value指的是需要传递的参数值,多个参数之间用逗号“,”分隔,如果定义的函数中有返回值,可以使用一个变量进行接收。函数的定义与调用应用举例函数的定义与调用举例如右图所示。右图中定义了一个获取偶数的函数,此函数体中有返回值,在调用时使用变量evenlist对其进行接收,并将其打印出来。函数的定义与调用应用举例函数也是可以嵌套使用的,如右图所示。函数的定义与调用应用举例函数的定义与调用应用举例在上页代码中将“案例1:计算体脂率”进行改造,定义一个计算体脂率的函数count_bodyfat,在此函数中又定义了一个根据体脂率判断体型的函数decide_health,此代码的运行结果如右图所示。函数的定义与调用应用举例上页代码中还为函数添加了说明文档,函数的说明文档放在字符串中,通常位于函数内部、所有代码的最前面(如右图),可以通过内置的help()函数或__doc__属性获取说明文档的内容,如下图所示。函数的返回值在函数定义中,若需要获取返回结果可使用return语句指定返回值。函数调用的参数传递解决向函数内部输入数据问题,返回值解决向外部输出数据问题。当函数中有return语句时,执行该语句会直接结束函数执行,可简单理解为return语句用于退出函数。其语法格式为return[value],value为可选参数,不指定则返回None,可一个或多个值,任意类型。return语句的应用举例见下页。函数的返回值return语句的使用Python常用内置函数我们在前面3章已经使用了很多Python的内置函数,最常用的就是在2.1.1中介绍的基本输入输出函数input()和print(),除此之外我们在学习第2章的时候也用到了很多内置函数,如int()、list()、range()等。为了能够让大家更容易记忆常用的内置函数,这里按照功能将其分为数学运算、序列相关、类型转换、逻辑判断和对象操作。其中类型转换类在第2章已经介绍过,此处不再赘述。数学运算数学运算相关的常用内置函数总结如表4-2所示。数学运算数学运算类的常用内置函数使用举例如【代码4-4】所示。数学运算序列相关序列相关的常用内置函数总结如下图所示。下图中列举的序列相关函数我们在2.3中都使用过,此处不再举例说明逻辑判断逻辑判断相关的常用内置函数总结如表4-4所示。逻辑判断逻辑判断类的常用内置函数使用举例如下图所示。对象操作对象操作类的常用内置函数总结如下图所示。上图中列举的对象操作相关函数,都很简单且大部分函数在之前章节都使用过,此处不再举例说明。案例【案例描述】哥德巴赫是一位德国数学家,1742年哥德巴赫在给欧拉的信中提出了以下猜想:任一个大于2的整数都可写成三个质数之和。但是哥德巴赫自己无法证明它,于是就写信请教赫赫有名的大数学家欧拉帮忙证明,欧拉在回信中提到了另一个等价版本,即任一大于2的偶数都可写成两个质数之和,现在常说的的哥德巴赫猜想指的是欧拉的版本。欧拉虽然提出了等价版本,但是他直到死也始终无法证明这个猜想。【案例要求】设计一个程序用于验证哥德巴赫的猜想,从键盘随意输入一个大于2的偶数,输出其分解式,如果输入的偶数找不到分解式,则代表哥德巴赫猜想不成立,如果随意输入的每个偶数都能有分解式,则认为歌德巴赫猜想是不能证伪的。案例02参数传递与变量作用域上节我们学习了函数的定义、调用、返回值等函数的基础知识,掌握了这些知识之后,我们可以自定义一个函数并使用,但是如果想在开发中熟练应用函数或是能读懂其他人写的函数相关代码,还需要掌握参数传递和变量作用域的相关知识。形式参数与实际参数函数调用时的参数传递实现了从函数外部向函数内部输入数据的问题,定义函数时函数名后括号中的参数为形式参数,调用函数时函数名后括号中的为实际参数,如下图所示。在定义函数时,函数的形式参数不代表任何具体的值,只有在函数调用时,才会有实际参数传给函数。参数传递的分类实际参数传递给形式参数时,根据实际参数类型不同分为传递不可变对象和传递可变对象。传递不可变对象时,参数传递后改变形式参数值,实际参数值不变;传递可变对象时,参数传递后改变形式参数值,实际参数值也改变。在Python中,字符串、元组、数字类型是不可变对象,列表、字典是可变对象,关于参数传递的举例见右图。参数传递的分类上页的运行结果如下图所示。参数传递的分类

从上页的运行结果可看出,不可变对象的参数传递过程中传递的只是对象的值,没有影响对象本身,在执行函数体过程中,会在内存中生成一个新的对象,被调用后对象的内容没有改变;而可变对象的参数传递过程中传递的是引用,在执行函数体过程中,没有生成新对象,被调用后对象的内容随着形式参数的改变而改变。函数传递的参数分类在函数调用过程中根据传递的参数类型,可将参数分为位置参数、关键字参数、默认参数、不定长参数和强制关键字参数。1.位置参数位置参数也称为必须参数,就是必须以正确的顺序传入给函数。我们之前使用的参数传递均是位置参数,位置参数需要确保两点,第一点是数量必须与定义时一致,第二点是位置必须与定义时一致。接下来以调用【代码4-2】中定义的count_bodyfat函数为例,分别介绍一下数量与定义时不一致、位置与定义时不一致时会出现的情况。位置参数(1)参数数量与定义时不一致当数量与定义时不一致时,将出现TypeError错误,如图4-12所示,出现错误的原因是缺少“height”和“weight”两个参数。位置参数(2)参数位置与定义时不一致当位置与定义时不一致时,也将出现TypeError错误,如图4-13所示,出现错误的原因是形式参数的类型与实际参数的类型不一致,并且在函数中,这两种类型还不能正常转换。位置参数但是有一种情况,就是在调用函数过程中,虽然指定的实际参数与形式参数的位置不一致,但是它们之间的数据类型一致,那么程序不会报错,但是会出现得到的结果与实际不符的情况,如下图所示。上图中,年龄和身高参数调换了位置,程序可以正常运行,但是计算出的体脂率是负数,明显不符合实际情况。关键字参数关键字参数是在调用函数时用形式参数的名字指定输入参数。使用关键字参数,函数调用时只需写正确参数名,无需考虑参数顺序与声明不一致的问题,因为Python解释器能根据参数名匹配参数值,使参数传递更灵活方便。以调用【代码4-2】中定义的count_bodyfat函数为例理解关键字参数,如下图所示。上图中,身高和年龄的位置是与定义函数时不一致的,但是此函数能正常运行,且得到的结果是合理的。默认参数如果在函数定义时,直接指定了默认值,那么在调用函数时,即使没有传入这个参数,程序也不会报错。需要注意的时,在定义函数时,默认参数必须放在所有参数之后,不然会报错,如下图所示。默认参数关于默认参数的使用举例如下图所示。不定长参数不定长参数也叫可变参数,即可传入的实际参数可以是多个。不定长参数有两种形式,一种是加一个星号“*”以元组的形式传入,还有一种是加两个星号“**”以字典的形式传入。不定长参数*parameter一个星号“*”形式的参数是和元组结合起来一起使用的,表示接收任意多个实际参数并将其放入到一个元组中,使用举例如右图所示。不定长参数上图的运行结果如下图所示。强制关键字参数除了上述介绍的4种参数之外,函数传递过程中的参数还有一种强制关键字参数,如果开发过程中需要限制关键字参数的名字时则可以使用这种参数。强制关键字参数需要一个特殊分隔符“*”,后面的参数被强制设为关键字参数。在函数调用时,分隔符“*”后面的参数一定要给出名字,否则会报SyntaxError错误,如下图1所示。变量作用域所谓变量的作用域就是变量的有效区域,即变量在该区域内能被解释器识别,超出该区域时访问会报错。变量的作用域由变量的定义位置决定,在不同位置定义的变量,它的作用域是不一样的。本节我们主要介绍局部变量和全局变量。局部变量局部变量是指在函数内部定义并使用的变量,它的作用域也仅限于函数内部,出了函数再使用就会报错。如图4-22所示,由于template是在showinfo()函数内部定义的变量,在函数之外使用即会出现NameError错误。局部变量需要注意的是函数参数也属于局部变量,在函数外部使用会报错,如下图所示。全局变量全局变量是指既能在函数内使用也能在函数外使用的变量。如下图所示。全局变量需要注意的是如果想在函数内修改函数外定义的变量,可以使用global关键字,举例如下图所示。全局变量下图为分别调用demo1()和demo2()的结果。匿名函数与高阶函数匿名函数就是没有名字的函数,与普通函数相比,匿名函数除了没有名字外,功能也比较单一,不包括循环结构,没有return语句,通常只是一个表达式。而高阶函数就是允许把函数作为参数传入到另一个函数中,还允许返回一个函数,所谓的函数式编程就是指这种高度抽象的编程范式。在Python中,匿名函数常被使用在高阶函数中。匿名函数的定义与使用在Python中,匿名函数又叫lambda表达式,使用lambda关键字来创建,其语法格式如下:参数说明如下图所示。匿名函数的定义与使用关于匿名函数的使用举例如下图所示。匿名函数的定义与使用上页的运行结果如下图所示。在上页中,分别使用变量result1、result2和result3来接收匿名函数,方便后面对其进行调用,而匿名函数最大的特点就是不用起名字,所以在实际代码开发中,类似上页中单独使用匿名函数的情况较少,匿名函数的意义是在高阶函数中使用。Python内置的高阶函数Python中的sorted()、map()、filter()等内置函数都是高阶函数。我们首先来看之前接触最多的sorted()函数。(1)sorted()函数的定义与使用sorted()函数用于对所有可迭代对象进行排序操作,其语法格式如下:Python内置的高阶函数sorted()函数中的参数key可以使用匿名函数,举例如下图所示。Python内置的高阶函数上页的运行结果如图4-27所示。在上页中,sorted()函数内的参数key使用匿名函数来指定,意思是按照分数进行排序,参数reverse设置为True,意思是排序规则是降序。Python内置的高阶函数map()函数的定义与使用map()函数主要用于根据提供的函数对指定序列做映射,其语法格式如下:其中function是用于指定序列映射规则的函数,iterable用来指定序列,可以是多个。简单理解map()函数就是对传入的序列数据进行逐项处理,针对序列的每一项数据都使用传入的函数进行操作,最后生成一个迭代对象。Python内置的高阶函数map()函数中的function可以使用匿名函数,举例如下图所示。Python内置的高阶函数上页的运行结果如下图所示。filter()函数的定义与使用filter()函数用于过滤序列,即过滤出符合条件的元素,返回一个迭代器对象,其语法格式如下:Python内置的高阶函数其中function用于指定判断函数,iterable用于指定序列,function可以使用匿名函数,举例如【代码4-14】所示。案例【案例描述】某公司销售员的年底奖金和该销售员年度销售额强相关,计算方法如下:年销售额小于等于10万元时,奖金按照销售额的2%计算。年销售额在10万~20万之间(包含20万)时,小于10万元部分按2%提计奖金,高于10万元部分,按5%提计奖金。年销售额在20万~50万之间时,高于20万部分按8%提计奖金。年销售额在50万~100万之间时,高于50万部分按10%提计奖金。年销售额大于100万元时,高于100万元部分按照15%提计奖金。【案例要求】设计一个函数用于计算该公司销售员的奖金,当用户输入销售金额时,通过该函数可正确计算出奖金金额并打印出来。案例案例我们以销售额100万元时为例,看一下程序是怎样运行的,如右图所示。1.用户输入100,程序接收到用户输入的数据。2.调用计算奖金的函数count_bonus,将用户输入的数据做为参数传入函数中,并用bonus来接收返回值。3.进入函数count_bonus中,当for循环中的i取值为0、1、2时,if中的条件判断表达式为False,程序走else里面的语句。4.当i取值为3时,sales的值为50,此时if中的条件判断表达式为True,程序执行if中的代码,计算出奖金值bonus为8.1,然后将sales赋值为0,执行break语句退出循环。5.执行语句“bonus+=sales*rates[-1]”,因此时sales为0,所以bonus仍然为8.1。6.函数执行完毕,将程序的返回值赋值给bonus。7.使用print语句打印出奖金金额8.1万元。04本章回顾1.定义函数的关键字是()。A.function B.def C.return D.define2.关于函数的定义与调用,以下描述错误的是()。A.函数的定义是通过参数和函数体决定函数能做什么,但函数并没有被执行,如果想要执行该函数就需要调用函数B.在函数定义时,可以指定多个参数,参数间使用逗号“,”分隔C.定义一个什么都不干的函

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论