版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章函数函数定义与调用4.1参数传递4.2函数变量作用域4.3递归4.4匿名函数4.5常用内置函数4.6本章小结4.7本章实训4.8本章导读34.1函数定义与调用4.1函数定义与调用5分而治之逻辑简单流程嵌套逻辑复杂模块化程序设计6函数是指用于进行某种计算或具有某种功能的一系列语句的有名称的组合。函数定义格式:4.1函数定义与调用def
函数名([参数列表]):
"""文档注释"""
函数体语句
return
返回值4.1函数定义与调用7def
函数名([参数列表]):
"""文档注释"""
函数体语句
return
返回值关键字冒号结束4.1函数定义与调用8def
函数名([参数列表]):
"""文档注释"""
函数体语句
return
返回值符合规范的名字符合命名规则,字母、下划线和数字组成应具有一定含义read_file()、get_data()能简单说明函数的功能4.1函数定义与调用9def
函数名([参数列表]):
"""文档注释"""
函数体语句
return
返回值0个或多个参数4.1函数定义与调用10def
函数名([参数列表]):
"""文档注释"""
函数体语句
return
返回值函数体相对于def缩进一档4.1函数定义与调用11def
函数名([参数列表]):
"""文档注释"""
函数体语句
return
返回值三对双引号引起来包括该函数的功能、可接受参数的个数和数据类型、返回值的个数和类型等函数功能注释函数体4.1函数定义与调用12def
函数名([参数列表]):
"""文档注释"""
函数体语句
return
返回值函数体实现函数功能的一条或多条程序语句4.1函数定义与调用13def
函数名([参数列表]):
"""文档注释"""
函数体语句
return
返回值函数体返回值返回值关键字将函数的处理结果返回给调用处返回值没有类型限制,也没有个数限制返回值为多个时,以元组形式返回返回值个数为0时,返回“None”实例说明:定义一个函数,接收一个浮点数表示圆的半径,计算圆的面积并返回。4.1函数定义与调用14实例4.1计算圆的面积函数15importmathdefcircle_area(r):#函数定义语句与参数,参数r值来自radius
"""接收圆的半径,计算并返回圆形的面积"""#文档字符串(文档注释)
area=math.pi*r**2#返回圆的面积
returnarearadius=float(input())#输入圆的半径,例如5.6area=circle_area(radius)#调用函数计算圆面积,radius值传递给函数中的rprint(f"圆形的面积为:{area:.2f}")#圆形的面积为:98.52实例代码:实例4.1计算圆的面积函数一般将函数的定义放在程序的开头部分先定义后调用16importmathdefcircle_area(r):#函数定义语句与参数,参数r值来自radius
"""接收圆的半径,计算并返回圆形的面积"""#文档字符串(文档注释)
area=math.pi*r**2#返回圆的面积
returnarearadius=float(input())
#输入圆的半径,例如5.6area=circle_area(radius)
#调用函数计算圆面积,radius值传递给函数中的rprint(f"圆形的面积为:{area:.2f}")
#圆形的面积为:98.52实例代码:实例4.1计算圆的面积函数每个函数之间、函数与主程序之间各留一个空行每个函数之间、函数与主程序之间各留一个空行4.1函数定义与调用17importmathdefcircle_area(r):#函数定义语句与参数
"""接收圆的半径,返回并返回圆形的面积"""#文档字符串(文档注释)
returnmath.pi*r**2#返回圆形的面积if__name__=='__main__':#判断是否在主程序中运行
radius=float(input())#输入圆的半径,例如5.6
area=circle_area(radius)#调用函数计算圆面积
print(f"圆形的面积为:{area:.2f}")#圆形的面积为:98.52代码文件作为脚本直接执行时,代码块执行代码文件被其他程序用import导入时,代码块不执行当代码中的函数和方法可能会被其他程序调用时,一般建议使用这种模式,使代码既可以作为单独的程序直接运行,又可以被作为模块导入到其他程序中。18无参无返回值函数一般在函数内部会有输出语句或绘图语句,函数的返回值是None在调用函数时不需要使用赋值语句或是print()函数4.1函数定义与调用实例说明:定义一个函数,无参数和返回值,函数的功能是在两行里用中英文分别输出'Lifeisshort,youneedPython'和'人生苦短,我用Python'。4.1函数定义与调用19实例4.2人生苦短,我用Python20defyou_need_python():#函数名用小写字母单词组合"""无参数,作用是分别在两行里用英文和中文输出'人生苦短,我用Python',函数没有返回值"""
print('Lifeisshort,youneedPython')#输出:'Lifeisshort,youneedPython'
print('人生苦短,我用Python')#输出:'人生苦短,我用Python'you_need_python()#调用函数,无参数,函数无返回值时调用时不需输出语句实例代码:实例4.2人生苦短,我用Python函数内部会有输出语句print()函数内部会有输出语句print()调用函数时不需要赋值语句或是print()函数21无参有返回值函数函数定义时有返回值,调用函数时需要使用print()函数输出可赋值语句为函数返回值命名,以便重复使用4.1函数定义与调用defyou_need_python():#函数名用小写字母"""无参数,函数返回值为字符串'人生苦短,我用Python'"""
return'人生苦短,我用Python'#返回处理结果给调用函数处you_need_python()#直接调用时无输出print(you_need_python())#需用print()输出返回值,人生苦短,我用Python函数有返回值使用print()函数输出函数返回值22有参无返回值函数调用时要按对应顺序传递几个参数函数体内直接输出处理结果,无返回值语句调用函数时不需要使用print()函数输出4.1函数定义与调用实例说明:定义一个函数,接收一个浮点数参数r表示球的半径,函数的功能计算并输出以r为半径的球的表面积,函数无返回值。4.1函数定义与调用23实例4.3计算并输出球的表面积24importmathdefsphere_surface_area(r):
"""接收球的半径,计算并输出球的表面积参数:r--球的半径无返回值,函数里直接输出球的表面积"""
area=4*math.pi*r**2
print(f"球的表面积为:{area:.2f}")#打印计算结果,球的表面积为:394.08radius=float(input())#输入球的半径,例如5.6sphere_surface_area(radius)#调用函数计算球的表面积实例代码实例4.3计算并输出球的表面积函数需要参数函数体内输出处理结果,无返回值语句调用时传递参数调用时不需要print()输出25有参有返回值函数调用时要按对应顺序传递参数调用函数时一般需要使用print()函数输出4.1函数定义与调用4.1函数定义与调用26importmathdefsphere_surface_area(r):
"""接收球的半径,计算并返回球的表面积
参数:r球的半径,返回值:球的表面积"""
return4*math.pi*r**2radius=float(input())#输入球的半径,例如5.6area=sphere_surface_area(radius)#调用函数计算球的表面积print(f"球的表面积为:{area:.2f}")#打印计算结果,球的表面积为:394.08函数需要参数调用时传递参数函数有返回值调用时将返回值赋值变量27多参数多返回值函数调用时要按对应顺序传递参数用一个return以元组形式返回多个返回值,表示元组的括号可以省略4.1函数定义与调用实例说明:定义一个函数,接收一个浮点数参数r表示球的半径,函数的功能计算并返回球的表面积和体积。4.1函数定义与调用28实例4.4计算并输出球的表面积和体积29importmathdefsphere_properties(r):
"""
接收球的半径,计算并返回球的表面积和体积参数:r--球的半径;返回值:返回输出球的表面积和体积"""
surface_area=4*math.pi*r**2#计算球的表面积
volume=4/3*math.pi*r**3#计算球的体积
returnsurface_area,volume#返回2个计算结果r=float(input())#输入球的半径和圆周率,例如5.6#调用函数计算球的表面积和体积,函数返回值同步赋值给变量s和vs,v=sphere_properties(r)#调用函数,返回2个计算结果print(f"球的表面积为:{s:.2f}")#球的表面积为:394.08print(f"球的体积为:{v:.2f}")#球的体积为:735.29实例代码实例4.4计算并输出球的表面积和体积函数需要参数调用时传递参数函数有多个返回值以元组形式返回,括号可以省略4.2参数传递4.2参数传递3132位置固定,参数传递时按照形式参数定义的顺序提供实际参数。优点:使用方便缺点:当参数数目较多时,函数调用容易混淆。4.2.1位置传递实例说明:定义一个函数,接收圆锥的底面半径、高和圆周率,返回圆锥的表面积和体积。4.2.1位置传递33实例4.5计算并输出圆锥的表面积和体积实例4.5计算并输出圆锥的表面积和体积34importmathdefcone(radius,height,pi):#radius,height,pi分别赋值为r,h和math.pi"""接收圆锥的底面半径、高和圆周率,返回圆锥的表面积和体积,圆锥的表面积计算公式为:S=π*r**2+π*r*l,l为圆锥母线;圆锥的体积计算公式为:V=1/3*(pi*r*r*h),h为圆锥的高"""
generatrix=(radius**2+height**2)**0.5#母线长度
area=pi*radius*(radius+generatrix)#表面积
volume=1/3*pi*radius**2*height#体积
returnarea,volume#返回表面积与体积r=8#底面半径h=4.5#高s,v=cone(r,h,math.pi)#返回的area,volume分别赋值给s,vprint(f'圆锥的表面积为{s:.2f},体积为{v:.2f}')#圆锥的表面积为431.75,体积为301.59实例代码函数需要3个参数:底面半径、高和圆周率调用时按顺序给出底面半径、高和圆周率3个参数35提供实际参数对应的形式参数名称,根据每个参数的名称传递参数,关键字并不需要遵守位置的对应关系。优点:明确实际参数和形式参数的对应关系,参数书写顺序更灵活缺点:增加了函数调用时的代码书写量4.2.2关键字传递4.2.2关键字传递36importmathdefcone(radius,height,pi):
"""接收圆锥的底面半径和高,返回圆锥的表面积和体积,圆锥的表面积计算公式为:S=π*r**2+π*r*l,l为圆锥母线;圆锥的体积计算公式为:V=1/3*(pi*r*r*h),h为圆锥的高"""
generatrix=(radius**2+height**2)**0.5#母线长度
area=pi*radius*(radius+generatrix)#表面积
volume=1/3*pi*radius**2*height#体积
returnarea,volume#返回表面积与体积的元组r,h=8,4.5#可同步赋值底面半径和高s,v=cone(height=h,pi=math.pi,radius=r)#显式赋值,顺序与位置无关print(f'圆锥的表面积为{s:.2f},体积为{v:.2f}')#圆锥的表面积为431.75,体积为301.59函数需要3个参数:底面半径、高和圆周率调用时按名称给出底面半径、高和圆周率3个参数关键字传递和位置传递混用时,按位置传递的参数要在按关键字传递的参数前面。37在定义函数的时候,可以使用形如pi=3.14的方式给参数赋予默认值。在函数调用时,如果该参数得到传入值,按传入值进行计算,否则使用默认值。优点:可以降低调用函数的难度。4.2.3默认值传递默认参数可指向不可变对象,如整型(int)、字符串(string)、浮点型(float)、元组(tuple)等,不能指向字典(dict)和列表(list)等可变对象。4.2.3默认值传递38importmathdefcone(radius,height,pi=3.14):
"""接收圆锥的底面半径和高,返回圆锥的表面积和体积,圆锥的表面积计算公式为:S=π*r**2+π*r*l,l为圆锥母线;圆锥的体积计算公式为:V=1/3*(pi*r*r*h),h为圆锥的高"""
generatrix=(radius**2+height**2)**0.5#母线长度
area=pi*radius*(radius+generatrix)#表面积
volume=1/3*pi*radius**2*height#体积
returnarea,volume#返回表面积与体积r,h=8,4.5#可同步赋值底面半径和高s,v=cone(r,h)#调用时不传入参数PI时pi值取函数定义时的认值3.14print(f'圆锥的表面积为{s:.2f},体积为{v:.2f}')#输出:圆锥的表面积为431.53,体积为301.44s,v=cone(r,h,math.pi)#调用时传入math.pi按传入值3.141592653589793计算print(f'圆锥的表面积为{s:.2f},体积为{v:.2f}')#输出:圆锥的表面积为431.75,体积为301.59参数pi赋予了值3.14调用时未给定第3个参数的值,使用3.14默认值参数必须放在必选参数之后。调用时给定第3个参数的值math.pi,使用3.1415926535897934.3函数变量作用域40变量的作用域就是指变量的有效范围,变量按照作用范围分为全局变量和局部变量。4.3函数变量作用域全局变量在函数外部声明的变量作用域是整个文件(或模块)在函数内部、外部都可以访问局部变量在函数内部声明的变量其作用域是声明这个变量的函数内部在函数外部不可以访问4.3函数变量作用域41importmathdefsphere_surface_area(r):
"""接收球的半径,计算并返回球的表面积,参数r是球的半径,返回值为球的表面积"""
print(4*math.pi*radius**2)#radius是全局变量,可以在函数内部直接使用,394.0813824663036
return4*math.pi*r**2#利用局部变量r计算球表面积并返回给调用处radius=float(input())#输入球的半径,例如5.6area=sphere_surface_area(radius)#调用函数计算球的表面积print(f"球的表面积为:{area:.2f}")#打印计算结果,球的表面积为:394.08print(r)#r是局部变量,只能在函数内部使用,函数外部不能使用#NameError:name'r'isnotdefinedr是函数sphere_surface_area的形参,只能在函数内部使用在函数sphere_surface_area外部使用r,报错Radius、area是全局变量Radius、area是全局变量函数内部给全局变量赋值,会创建同名的局部变量,屏蔽全局变量在函数体内,使用global关键字来声明变量的作用域为全局全局变量值为列表等可变数据类型时,在函数内部直接修改变量值,无须加global4.3函数变量作用域424.3函数变量作用域43defmy_list():
lsx.append(1)#改变全局变量lsx的值,未重新创建对象
lsy=[2,3,4]#创建新对象[2,3,4],赋值给局部变量lsy
print(id(lsx),id(lsy))#13685288771841368528876928
print(lsx,lsy)#lsx的值为[1],lsy的值为[2,3,4]lsx,lsy=[],[]print(id(lsx),id(lsy))#13685288771841368528800128my_list()print(lsx,lsy)#lsx值变为[1],lsy值未变化仍为[]在函数my_list内部,直接改变lsx,lsy的值lsx,lsy是列表类型的全局变量在函数my_list内部,直接改变lsx,lsy的值4.4递归45递归概念如果一个函数在内部调用函数本身,这个函数就是递归函数。递归算法是将原问题不断分解为规模缩小的子问题,然后递归调用方法来表示问题的解。4.4递归46递归算法特性1.必须有一个明确的递归终止条件,使递归在有限次调用后要进行回溯才能得到最终的结果。2.在递归的临界点应该直接给出问题的解决方案。3.每次进入更深一层递归时,问题规模相比上次递归都应有所减少或更接近于解。4.4递归实例说明:猴子第一天摘下若干个桃子,当即吃了一半,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半再多一个。到第10天早上想再吃时,看见只剩下一个桃子了。问第一天共摘了多少个桃子。4.4递归47实例4.6猴子吃桃问题实例4.6猴子吃桃问题48思路:前1天桃子数量是后面一天桃子数量加1之后再乘以2,即:由此可推出第2天、第3天、...第10天的公式。第10天的公式,再逆向回溯可计算。第9天时桃子数量是4个(吃掉一半剩2个,再多吃一个只剩1个)第8天时桃子数量是10个桃子,...以此类推,可以计算出第一天的桃子数量。实例4.6猴子吃桃问题49defpeach_count(days):
"""递归计算第一天共摘了多少个桃子参数:days总共的天数返回值:第一天共摘了多少个桃子"""
ifdays==10:#递归出口,第10天只有1个桃子
return1#第10天只有1个桃子
else:#递归调用,第day天的桃子数等于第day+1天的桃子数加1再乘以2
return(peach_count(days+1)+1)*2#peach_count(days+1)第days+1天的桃子数count=peach_count(1)#调用函数计算第1天的桃子数量print(f"第一天共摘了{count}个桃子")#输出结果实例代码:实例4.6猴子吃桃问题50left=1#第十天剩余的桃子数fordayinrange(9,0,-1):#从第9天开始倒推
left=(left+1)*2#第day天的桃子数print(left)#第一天的桃子数非递归实现代码:所有的递归函数都可以写成循环的方式。递归函数的优点是定义简单,逻辑清晰,缺点是效率不高,而且使用递归函数需要注意防止栈溢出。python中一般默认递归深度在1000左右,程序如果递归太深,那么可能会因为超过系统默认的递归深度限制而触发异常。4.5匿名函数52匿名函数是一个没有函数名字的临时使用的小函数。定义语法:若函数只有函数定义和返回值,那么可以写成匿名函数直接使用lambda函数,主要应用在函数式编程中4.5匿名函数deffun(参数列表):#参数可以是一个,也可以是多个
return表达式
#可以写为
lambda参数列表:表达式4.5匿名函数53deffun(x):
return3*x**2+2*x+1print(fun(4))#57#可以用匿名函数代替f=lambdax:3*x**2+2*x+1print(f(4))#不允许包含循环、条件判断等复杂的语句。lambda函数可以将其赋值给变量或作为其他函数的参数来使用。例如,作为sorted()、map()、reduce()、filter()等函数的参数。实例说明:在做成绩数据分析时,文件中的数据读成字符串,切分后可得到元素为字符串的列表,['75','85','100','68','9'],根据元素的数值升序排序。4.5匿名函数54思路:直接使用sorted()函数排序时,默认是按字符串进行比较排序,若希望根据整数值大小排序,可以使用lambda函数作为参数key的值,以冒号后面的表达式int(x)为排序依据即可实现根据数值进行排序了。实例4.7列表排序实例4.7列表排序55ls=['75','85','100','68','9']#读成绩文件中的数据切分为元素为字符串的列表print(sorted(ls))#按字符串升序排序['100','68','75','85','9’]print(sorted(ls,key=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年校招:百度笔试题及答案
- 尿道折叠术后护理查房
- 《骨肉瘤与肺结核诊疗》课件
- 2026年秋招:字节跳动笔试题及答案
- 2026年秋招:中国邮政面试题及答案
- 简单投资技巧董政豪
- 番茄病虫害防治大全
- 胰岛素治疗指南到实践
- 心血管病风险因素评估
- 2026年考研管理类联考数学函数与极限课件
- 驾驶人员技能培训课件
- 2025年中职(动漫与游戏制作)二维动画制作试题及答案
- 亮剑的团队精神
- 儿童电除颤教学课件
- 劳动监察培训课件
- 东北林业大学《生物科学专业英语》2023-2024学年第二学期期末试卷
- 建筑物拆除工程合同模板
- DB32T 3262-2017 移动泵机组运行与维护规范
- 会计基础第四版 课件 项目四 运用借贷记账法
- 2024年全国职业院校技能大赛高职组(社区服务实务赛项)考试题库(含答案)
- 计算机网络的发展
评论
0/150
提交评论