《Python程序设计任务驱动教程》 课件-第6章 函数_第1页
《Python程序设计任务驱动教程》 课件-第6章 函数_第2页
《Python程序设计任务驱动教程》 课件-第6章 函数_第3页
《Python程序设计任务驱动教程》 课件-第6章 函数_第4页
《Python程序设计任务驱动教程》 课件-第6章 函数_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

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

文档简介

第6章函数《Python程序设计任务驱动教程》学习目标/Target

了解函数的概念,能够理解程序中使用函数的好处

掌握函数的定义和调用,能够熟练定义和调用函数

掌握参数的传递方式,能够通过各种类型的参数向函数传递数据

熟悉作用域的概念,能够区分程序中的全局变量和局部变量学习目标/Target

掌握global或nonlocal关键字的用法,能够通过这两个关键字修改变量的作用域

掌握递归函数的使用,能够运用递归函数解决阶乘的问题

掌握匿名函数的使用,能够运用匿名函数简化简单函数的定义章节概述/Summary在开发程序时有些功能的逻辑十分相似或完全相同,只要使用这个功能,就需要在相应的位置执行相似或者重复的代码块。如果一个代码块存在问题,那么所有的代码块都要同步修改。这不仅会让程序存在大量重复的代码块,而且增加了代码的维护成本。函数的出现便解决了这些问题,它会将相似或重复的代码封装成特定功能的代码块,实现代码模块化,使整个程序的结构变得清晰。本章通过6个任务对函数相关的知识进行详细讲解。目录/Contents任务6-1寻找缺失数字任务6-2简易计算器任务6-3求平均数目录/Contents任务6-4智能问答机器人任务6-5失之毫厘,谬以千里任务6-6点名册寻找缺失数字任务6-1任务描述现有一组数字1~10,我们先从这组数字中抽出一个数字8,再将剩余数字的顺序全部打乱,打乱顺序后得到的一组数字为10、1、4、3、6、9、2、5、7。本任务要求读者编写一个函数,用于从打乱顺序后的这组数字中寻找缺失数字8。【任务目标】知识储备了解函数的概念,能够理解程序中使用函数的好处学习目标1.认识函数知识储备1.认识函数在程序开发中,函数是组织好的、实现单一功能或相关联功能的代码段。在前面的章节中我们已经接触过一些函数,例如,用于向控制台输出语句的print()函数、用于接收用户输入的input()函数等。知识储备1.认识函数未使用函数的程序使用函数的程序本程序输出由2*2、3*3、4*4个星号组成的正方形。从图中可以看出,使用函数的程序结构更加清晰、代码更加精简。知识储备1.认识函数试想一下,程序若希望再输出一个由5*5个星号组成的正方形,怎么办呢?知识储备1.认识函数未使用函数的程序使用函数的程序对于使用函数的程序而言,只需要再次使用输出正方形的函数,并将函数中参数length的值修改为5即可。对于未使用函数的程序而言,需要重新编写一段代码,代码冗余度很高知识储备1.认识函数综上所述,相较之前的编程方法,函数式编程将程序模块化,既减少了冗余代码,又让程序结构更为清晰;既能提高开发人员的编程效率,又方便后期的维护与扩展。知识储备掌握函数的定义,能够熟练地在程序中定义函数学习目标2.定义函数知识储备2.定义函数开发人员可以根据自己的需求定义函数,Python中使用关键字def来定义函数。def函数名([参数列表]):["""文档字符串"""]

函数体[return语句]标记函数的开始接收传入函数中的数据函数的唯一标识说明函数功能的字符串函数功能的具体代码标志函数的结束defadd_modify(a,b):result=a+breturnresult定义函数的语法格式定义函数的示例知识储备掌握函数的调用,能够熟练地在程序中调用函数熟悉函数调用的执行过程,能够归纳函数调用的执行过程学习目标3.调用函数知识储备3.调用函数函数在定义完成后不会立刻执行,直到被程序调用时才会执行。函数名([参数列表])语法格式add_modify(10,20)程序执行“add_modify(10,20)”的过程任务分析实现思路任务实现1.创建项目Chapter06及01_missing_num.py文件。2.在01_missing_num.py文件中编写代码。定义一个寻找缺失数字的函数find_miss_number()。通过find_miss_number()函数查找一组数字10、1、4、3、6、9、2、5、7中的缺失数字。3.运行01_missing_num.py文件。实现步骤简易计算器任务6-2任务描述计算器是近代人发明的可以进行数字运算的机器。本任务要求运用函数的知识,编写一个简易计算器程序,程序的要求如下。程序只支持两个数字的四则运算,数字和运算符由用户从键盘输入。用户输入quit会退出程序。【任务目标】知识储备掌握位置参数的传递方式,能够归纳位置参数的传递方式学习目标1.根据位置传递参数知识储备1.位置参数的传递我们通常将定义函数时设置的参数称为形式参数(简称为形参),将调用函数时传入的参数称为实际参数(简称为实参)。函数的参数传递是指将实际参数传递给形式参数的过程。知识储备1.位置参数的传递调用函数时,编译器会将函数的实际参数按照位置顺序依次传递给形式参数,即将第1个实际参数传递给第1个形式参数,将第2个实际参数传递给第2个形式参数,以此类推。defdivision(num_one,num_two):print(num_one/num_two)division(6,2)#位置参数传递知识储备掌握根据关键字传递参数的方式,能够归纳关键字参数的传递方式学习目标2.根据关键字传递参数知识储备2.根据关键字传递参数关键字参数传递通过“形式参数=实际参数”的格式将实际参数与形式参数相关联,根据形参的名称进行参数传递。definfo(name,age,address):print(f'姓名:{name}')print(f'年龄:{age}')print(f'地址:{address}')info(name="李婷婷",age=23,address="山东")知识储备2.根据关键字传递参数无论程序通过位置参数的方式传递实参,还是通过关键字参数的方式传递参数,每个形参都有名称的,怎么区分用哪种方式传递呢?知识储备2.根据关键字传递参数Python3.8中新增了仅限位置形参的语法,使用符号“/”来限定部分形参只接收通过位置参数方式传递的实参。deffunc(a,b,/,c):print(a,b,c)错误调用方式正确调用方式func(a=10,20,30)func(10,b=20,30)func(10,20,c=30)func(10,20,30)a、b必须接收采用位置参数的方式传递的实参

c为普通形参,它可以接收采用位置传递方式或关键字传递方式的实参。任务分析我们可以将每种运算封装为一个独立的函数,每个函数需要有两个参数,分别用于接收用户从键盘输入的第一个数和第二个数。add():用于计算两个数字相加。subtract():用于计算两个数字相减。multiply():用于计算两个数字相乘。divide():用于计算两个数字相除。main():用于控制一次使用简易计算器的完整流程。实现思路任务实现1.在Chapter06项目中创建02_calculator.py文件。2.在02_calculator.py文件中编写代码。定义计算两个数字相加的结果的函数add()。定义减法运算的函数subtract()

。定义乘法运算的函数multiply()。定义除法运算的函数divide()。定义用于控制简易计算器使用流程的main()函数。调用main()函数。3.运行02_calculator.py文件。实现步骤求平均数任务6-3任务描述平均数是统计学中常用的统计量。本任务要求读者编写代码,实现求一组数的平均数的函数,具体要求如下。输入数的数量是任意的。最终平均数的结果默认保留两位小数,也可以指定保留小数的位数。【任务目标】知识储备掌握默认参数的传递方式,能够归纳默认参数的传递方式学习目标1.默认参数的传递知识储备1.默认参数的传递定义函数时可以指定形式参数的默认值,调用函数时,若没有给带有默认值的形式参数传值,直接使用参数的默认值;若给带有默认值的形式参数传值,实际参数的值会覆盖默认值。第一种调用方式connect('127.0.0.1')connect(ip='127.0.0.1',port=8080)defconnect(ip,port=3306):print(f"连接地址为:{ip}")print(f"连接端口号为:{port}")print("连接成功")第二种调用方式覆盖port参数的默认值注意,函数中的默认参数必须放在参数列表末尾。知识储备掌握参数打包的方式,能够根据需求选择以元组或字典形式打包多个实参学习目标2.参数打包知识储备2.参数打包如果函数在定义时无法确定需要接收多少个数据,那么可以在定义函数时为形参添加“*”,这时该形参会接收以元组形式打包的多个实参。deftest(*args):print(args)test(11,22,33,44,55)打包成元组(11,22,33,44,55)知识储备2.参数打包如果函数在定义时无法确定需要接收多少个数据,那么可以在定义函数时为形参添加“**”,这时该形参会接收以字典形式打包的多个实参。deftest(**kwargs):print(kwargs)test(a=11,b=22,c=33,d=44,e=55)打包成字典{'a':11,'b':22,'c':33,'d':44,'e':55}知识储备2.参数打包虽然函数中添加“*”或“**”的形参可以是符合命名规范的任意名称,但这里建议使用*args和**kwargs。若函数没有接收到任何数据,参数args和kwargs为空元组和空字典。知识储备掌握参数解包的方式,能够根据需求使用“*”或“**”将元组或字典拆分成多个值或键值对学习目标3.参数解包知识储备3.参数解包如果函数在调用时接收的实参是元组类型的数据,那么可以使用“*”将元组拆分成多个值,并将每个值按照位置参数传递的方式赋值给形参。test(*(11,22,33,44,55))deftest(a,b,c,d,e):print(a,b,c,d,e)元组拆分成:11,22,33,44,55知识储备3.参数解包如果函数在调用时接收的实参是字典类型的数据,那么可以使用“**”将字典拆分成多个键值对,并将每个值按照关键字参数传递的方式赋值给与键名称对应的形参。test(**{"a":11,"b":22,"c":33,"d":44,"e":55})deftest(a,b,c,d,e):print(a,b,c,d,e)字典拆分成:"a":11,"b":22,"c":33,"d":44,"e":55知识储备掌握参数混合传递的规则,能够灵活应用多种参数的传递方式向函数内传入数据学习目标4.参数的混合传递知识储备4.参数的混合传递参数混合传递的规则优先按位置参数传递的方式然后按关键字参数传递的方式之后按默认参数传递的方式最后按打包传递的方式4321定义函数时混合使用参数的注意事项:带有默认值的参数必须位于普通参数之后。带有“*”标识的参数必须位于带有默认值的参数之后。带有“**”标识的参数必须位于带有“*”标识的参数之后。知识储备4.参数的混合传递deftest(a,b,c=33,*args,**kwargs):print(a,b,c,args,kwargs)test(1,2)test(1,2,3,4,e=5)test(1,2,3)deftest(a,b,c=33,*args,**kwargs):print(a,b,c,args,kwargs)test(1,2,3,4)deftest(a,b,c=33,*args,**kwargs):print(a,b,c,args,kwargs)deftest(a,b,c=33,*args,**kwargs):print(a,b,c,args,kwargs)知识储备熟悉round()函数的使用,能够使用该函数对浮点数进行四舍五入操作学习目标5.内置函数round()知识储备5.内置函数round()Python中内置函数round()

用于根据指定的位数对浮点数进行四舍五入操作,它的返回值是浮点数四舍五入后的结果。round(x[,n])语法格式x:表示数值表达式。n:可选项,表示保留的小数点位数,默认值为0。任务分析函数的功能是求一组数的平均数,考虑到一组数的数量是不固定的,因此函数的第一个参数可以设为可变参数,负责接收任意数量的数据;因为平均数默认保留两位小数,所以函数的第二个参数为默认参数,参数的值为2。实现思路任务实现1.在Chapter06项目中创建03_variable_parameter.py文件。2.在03_variable_parameter.py文件中编写代码。定义求一组数平均值的函数。调用求一组数平均值的函数,指定结果保留两位小数。调用求一组数平均值的函数,指定结果保留三位小数。3.运行03_variable_parameter.py文件。实现步骤智能问答机器人任务6-4任务描述本任务要求读者编写程序实现一个简易智能问答机器人——小智,用于帮助用户解答百科知识的问题,具体要求如下。智能问答机器人默认会解答5个问题。智能机器人启动后会向用户展示一个功能菜单。智能问答机器人有3项功能:训练、对话和离开,若用户从键盘输入t,说明用户想训练机器人,此时机器人需要记录训练的新问题及答案;若用户从键盘输入c,说明用户想跟机器人对话,此时机器人需要回答用户提出的问题;若用户从键盘输入l,说明让机器人离开,此时机器人需要退出程序。【任务目标】知识储备掌握局部变量,能够在程序中正确定义与访问局部变量学习目标1.局部变量知识储备1.局部变量局部变量是在函数内定义的变量,它只在定义它的函数内生效。defuse_var():

name='python'#局部变量print(name)#在函数内部访问局部变量use_var()print(name)#在函数外部访问局部变量知识储备掌握全局变量,能够在程序中正确地定义与访问全局变量学习目标2.全局变量知识储备2.全局变量全局变量是在函数外定义的变量,它在程序中的任何位置都可以被访问。count=10#全局变量defuse_var():print(count)#函数内访问全局变量use_var()print(count)#函数外访问局部变量知识储备2.全局变量函数内部只能访问全局变量,但不能直接修改全局变量。count=10#全局变量defuse_var():print(count)#函数内访问全局变量count+=1use_var()print(count)#函数外访问局部变量知识储备掌握global关键字,能够通过global关键字在函数内声明变量为全局变量学习目标3.global关键字知识储备3.global关键字global关键字用于将局部变量声明为全局变量,这样便可以在函数内部修改全局变量。count=10defuse_var():

globalcountcount+=1print(count)use_var()print(count)global变量语法格式知识储备掌握nonlocal关键字,能够在嵌套函数的内层函数中通过nonlocal关键字声明变量为外层函数的变量学习目标4.nonlocal关键字知识储备4.nonlocal关键字在嵌套函数的内层函数中无法直接修改外层函数的变量。为了解决这个问题,Python中提供了nonlocal关键字,该关键字用于将内层函数的变量声明为外层函数的变量。deftest():number=10deftest_in():

nonlocalnumbernumber=20test_in()print(number)test()nonlocal变量语法格式任务分析1.

训练机器人功能的函数train()

训练机器人功能是指增加机器人的问题储备量。只要用户选择训练机器人的功能,就会从键盘输入新的问题和答案,机器人需要将新问题及其答案进行存储。因此,train()函数有两个参数,分别用于接收新问题及其答案。实现思路2.

跟机器人对话功能的函数exchange()

跟机器人对话功能是指向机器人提问问题,机器人搜索自己的问题库后视情况给出答复:若在问题库中找到这个问题,则输出相应的答案,否则输出“小智:抱歉,这个问题我还不会回答!”exchange()函数需要有一个参数,用于接收用户提出的问题。任务实现1.在Chapter06项目中创建04_answer_robot.py文件。2.在04_answer_robot.py文件中编写代码。创建一个表示问题库的字典。定义两个全局变量,用于保存机器人的初始状态。定义训练机器人的train()函数。定义跟机器人对话的exchange()函数。使用while循环控制智能问答机器人的工作流程。3.运行04_answer_robot.py文件。实现步骤失之毫厘,谬以千里任务6-5任务描述下面以计算1.0和1.1的100次方为例,带领大家亲身感受到小错误的严重性。

我们无论是在生活还是在工作中,都应该对早期发现的小错误引起重视,绝不能放任不管,我们只有保持缜密、严谨的态度,不断地迭代,才能收获预期的结果。任务描述本任务要求读者编写程序,通过计算1.0和1.1的100次方的差来验证“失之毫厘,谬以千里”的道理。【任务目标】知识储备掌握递归函数的使用,能够运用递归函数解决阶乘的问题学习目标递归函数知识储备递归函数递归是一个函数过程在定义或说明中直接或间接调用自身的一种方法,它通常把一个大型的复杂问题层层转化为一个与原问题相似,但规模较小的问题进行求解。如果一个函数中调用了函数本身,这个函数就是递归函数。知识储备递归函数一、递归公式使用tuple()函数创建元组递归公式是递归求解过程中的归纳项,用于处理原问题以及与原问题规律相同的子问题。二、边界条件边界条件即终止条件,用于终止递归。知识储备递归函数deffactorial(num):ifnum==1:return1else:returnnum*factorial(num-1)求阶乘的递归函数阶乘递归过程任务分析

实现思路当y=0时,f(y)=1当y>0时,f(y)=x*f(y-1)下面以2的y次方为例,计算过程过程如下。任务实现1.在Chapter06项目中创建05_amiss_amile.py文件。2.在05_amiss_amile.py文件中编写代码。定义求x的y次方的数递归函数power()。计算1.1的100次方和1.0的100次方

温馨提示

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

评论

0/150

提交评论