模块5 设计自己的积木块-函数《Python 程序设计》教学课件_第1页
模块5 设计自己的积木块-函数《Python 程序设计》教学课件_第2页
模块5 设计自己的积木块-函数《Python 程序设计》教学课件_第3页
模块5 设计自己的积木块-函数《Python 程序设计》教学课件_第4页
模块5 设计自己的积木块-函数《Python 程序设计》教学课件_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

《Python程序设计》✩精品课件合集✩精品课件合集5.1函数基础5.2函数参数5.3变量的作用域5.4函数设计精选案例小结2023年9月23日2第五章设计自己的积木块—函数5.1函数基础2023年9月23日31.函数的定义程序设计中的函数就是把代码根据功能不同打包成不同形状的积木块,以便编程需要时进行调用,从而实现代码的复用,保证代码的一致性,简化代码的调试与维护工作。通常函数定义遵守“内聚性高,耦合度低”的原则。def函数名([形式参数列表]):‘’’

多行注释,也可以是单行注释 ’’’

函数体2.函数的定义示例

defadd(x,y):#定义一个函数add()

“这是一个求和函数” sum=x+yreturnsum#返回函数值5.1函数基础2023年9月23日4函数返回值和形式参数都不需要类型声明函数的返回值由return返回;无返回值时,可以没有return语句函数体相对于def关键字必须保持一定的空格缩进函数定义首行最后的”:”不能丢函数定义格式的“()”不能省略函数可以没有形式参数列表函数定义注意事项2023年9月23日53.关于注释>>>defadd(x,y):#定义一个函数add()

'''返回两个参数的和,

可以对整数、实数、复数以及列表、元组和字符串求和''' sum=x+y returnsum#返回所求的和“返回两个参数的和,

可以对整数、实数、复数以及列表、元组和字符串求和”这个注释的文字将存放在函数add()的__doc__属性中,当用help(add)查看时,将会显示此注释等信息。>>>help(add)也可Helponfunctionaddinmodule__main__:

add(x,y)

返回两个参数的和,

可以对整数、实数、复数以及列表、元组和字符串求和用print()输出__doc__的值>>>print(add.__doc__)5.1函数基础2023年9月23日64.函数调用Python中函数调用的一般格式是:函数名([实参列表])调用前述自定义的函数add()>>>sum=add(12,34)>>>sum46>>>k=add(54.3,32.4)>>>k86.69999999999999>>>add(1+3j,5-8j)(6-5j)>>>add("you","areagoodboy.")'youareagoodboy.'>>>add([1,2,3],[4,5,6])[1,2,3,4,5,6]>>>add((9,8,7,6),(1,2,3))(9,8,7,6,1,2,3)Python内建函数abs()(求绝对值)的调用>>>abs(23)23>>>abs(-45)45>>>abs(-12.78)12.785.1函数基础2023年9月23日75.Lambda表达式lambda表达式常用来声明匿名函数,即没有函数名字临时使用的小函数。其语法形式如:lambdaparams:expr其中params表示是参数,可以是多个,用”,”隔开;expr是函数要返回值的表达式。>>>f=lambdax:x**2+5*x+1#定义一个lambda表达式,x是参数>>>f(4)#调用lambda表达式37>>>g=lambdax,y,z:x+y+z#x,y,z是参数>>>g(3,7,1)11>>>g(x=5,z=4,y=4)#使用关键参数调用13>>>g(4,y=5,z=5)#使用位置参数和关键参数调用145.1函数基础2023年9月23日8简单的匿名函数,节省代码不复用的函数为了获得清晰简洁的代码,增加代码的可读性Lambda表达式一般用在以下这些情况5.1函数基础2023年9月23日9Python程序设计5.1函数基础5.2函数参数5.3变量的作用域5.4函数设计精选案例小结2023年9月23日11第五章设计自己的积木块—函数2023年9月23日12Python的函数定义非常简单,但是灵活性非常大,比如前述的add()函数,只要传递两个实参对象就可以进行”+”运算。Python函数定义时,形式参数不需要进行类型说明,同样返回值也不需要进行类型说明,这样就给函数功能等带来了很大的灵活性。另外,Python函数的形式参数可以是多种形式,如位置参数、默认参数、可变参数、关键参数,以提高函数的灵活性,简化调用。5.2函数参数2023年9月23日131.位置参数前述定义的add()函数有两个形式参数,当调用该函数时需要传递两个实际参数,依次传递给形式参数变量x和y。如add(-12,78.5)的调用,将-12传递x,78.5传递y,由于x,y在定义函数时的顺序就已经确定了,传递时,也是按顺序依次进行传递。像x,y这样的形式参数称之为位置参数。调用函数时,位置参数必须按次序传递,如果调用add()函数时,只给了一个实际参数,如:>>>add(12)Traceback(mostrecentcalllast):File"<pyshell#39>",line1,in<module>add(12)TypeError:add()missing1requiredpositionalargument:'y'从上面输出的错误提示中发现这样的关键词”positionalargument”,从而说明x,y是属于位置参数。5.2函数参数2023年9月23日142.默认参数即在定义函数时,为某些形式参数设置默认值,这类参数称之为默认参数。函数调用时,对于默认参数,如果没有提供实际参数,则使用默认值,如果提供了实际参数,则使用实际参数值。也就是说,在调用函数时,是否为默认参数传递实参是可选的,具有较大的灵活性。带有默认参数的函数定义格式如下:def函数名(…,形参名=默认值[,…]):‘‘’多行或单行注释’’’函数体定义一个函数my_pow(),求xy:defmy_pow(x,y=2):"求x的y次方"s=1foriinrange(y): s=s*xreturns>>>my_pow(3,5)#求35,将3传递给x,5传递给y243>>>my_pow(-3)#只提供了一个实参-3,传递给x,形参y使用默认值2,即求(-3)2

95.2函数参数2023年9月23日15>>>help(print)Helponbuilt-infunctionprintinmodulebuiltins:

print(...)print(value,...,sep='',end='\n',file=sys.stdout,flush=False)

Printsthevaluestoastream,ortosys.stdoutbydefault.Optionalkeywordarguments:file:afile-likeobject(stream);defaultstothecurrentsys.stdout.sep:stringinsertedbetweenvalues,defaultaspace.end:stringappendedafterthelastvalue,defaultanewline.flush:whethertoforciblyflushthestream.5.2函数参数都是默认参数默认参数要放在位置参数之后2023年9月23日163.关键参数如果一个函数有多个参数,在调用时,如果不想按位置顺序提供实参,那么可以通过按形式参数名来传递参数。这种参数传递方式称为关键参数。对前面定义的add()函数采用关键参数调用如下:>>>add(y=23,x=-43.2)

-20.200000000000003>>>add(y='czili.',x='Myschoolis')

'Myschoolisczili.'采用关键参数进行参数传递,可以不用考虑参数传递的顺序。避免了用户需要牢记参数顺序的麻烦,使得函数调用更加灵活方便。5.2函数参数关键参数是一种参数传递方式2023年9月23日174.可变长度参数可变长度参数,顾名思义就是传入的参数个数是可变的。Python中可变长度参数有两种形式,分别是*args和**kwds。*args用来接收任意多个实参并将其放在一个元组中,**kwds用来接收类似于显示赋值形式的多个实参并放入字典中。定义一个函数,求不定长序列的和,即求:a+b+c+……,所求序列的长度是不确定的,为此采用*args这种不定长参数的形式来定义函数如下:>>>defsum(*args): print(type(args))#查看一下args的类型 s=0 forkinargs:s=s+k print(s)sum()函数的调用>>>sum(1,2,3)<class'tuple'>#形参args是一个元组

6>>>sum(-34.5,23,79.8,234)<class'tuple'>302.35.2函数参数2023年9月23日184.可变长度参数(续)**kwds形式参数的函数定义>>>deffun(**kwds): print(type(kwds))#查看一下kwds的类型 forkey,vinkwds.items():#遍历一下kwds print(key,v)fun()函数的调用其实就是采用关键字参数的形式进行调用>>>fun(name='wang',sex='F',age=18)<class'dict'>#形式参数保存成字典的类型namewangsexFage185.2函数参数2023年9月23日195.关于参数传递关于参数传递,需要理解的是值传递还是引用传递。如果实参是不可变对象,则是值传递,如果实参是可变对象,则是引用传递。由于引用传递,在函数内修改引用对象的值时,这个修改也会改变实参引用对象的值。但是如果在函数内又重新创建了对象,并且是形参指向了新的对象,则不会修改实参引用对象的值。通过以下示例来进一步理解引用传递。>>>deffun_1(x):#定义一个函数 print(x)#输出传递过来的列表 x.append(8)#给列表追加一个元素8,修改了列表的值 print(x) #输出新列表的值>>>list=[0,1,2,3]>>>fun_1(list)#实参列表为可变对象[0,1,2,3][0,1,2,3,8]>>>list#调用函数后list的值

[0,1,2,3,8]

这个案例说明,在用列表作实参调用函数时,在函数内部修改了列表的值,则实参引用对

象list的值也改变了>>>deffun_2(x): print(x)

x=x+[88]

#创建了一个列表 print(x)>>>list=[0,1,2,3]>>>fun_2(list)[0,1,2,3][0,1,2,3,88]>>>list[0,1,2,3]#此处的list没有改变由于函数内的语句”x=x+[88]”是创建了新的列表对象,所以实参引用对象就不会改变了。5.2函数参数2023年9月23日20Python程序设计5.1函数基础5.2函数参数5.3变量的作用域5.4函数设计精选案例小结2023年9月23日22第五章设计自己的积木块—函数5.3变量的作用域2023年9月23日23变量的作用域就是变量起作用的范围,或者说是可以被哪部分程序访问,也可称为命名空间。一个变量在函数内部和外部定义,其作用域不同,如果用特殊关键字定义的变量,其作用域也有相应的规则。2023年9月23日241.局部变量在函数内部定义的变量(包括形式参数变量),其作用范围只在定义之后,到函数结束为止,这类变量是局部变量。【例5-1】编程求圆的面积。#eg5_1.py#writebyding#2018-4-23#导入math模块importmath#定义一个求圆面积的函数defcircle(r):print("函数内局部变量r=%.2f"%r)

s=math.pi*r*r#求面积

r=8#给r重新赋值print("修改函数内局部变量r后,r=%.2f"%r)returns#返回所求的面积

r=float(input("请输入圆的半径:"))print("函数外变量r=%.2f"%r)#调用函数求圆的面积area=circle(r)print("再次输出函数外变量r=%.2f"%r)print("半径为%.2f的圆,面积是%.2f"%(r,area))print("输出circle()函数内变量s的值%.2f"%(s))【例5-1】运行结果请输入圆的半径:5

函数外变量r=5.00函数内局部变量r=5.00修改函数内局部变量r后,r=8.00再次输出函数外变量r=5.00半径为5.00的圆,面积是78.54Traceback(mostrecentcalllast):File"C:\Users\Administrator\AppData\Local\Programs\Python\Python36\dh\ding\eg5-1.py",line25,in<module>print("输出circle()函数内变量s的值%.2f"%(s))NameError:name's'isnotdefined请结合运行结果理解局部变量的作用范围5.3变量的作用域2023年9月23日252.全局变量在函数外定义的变量,是全局变量,其作用域是整个程序范围。【例5-2】全局变量的应用示例。#eg5_2.py#writebyding#2018-4-24total=0#定义一个全局变量print("全局变量初始值为:%d"%total)

defsum(a,b):’’’使用关键字”global”说明全局变量之后,才可以修改其值,否则只能引用其值,不能修改’’’globaltotaltotal=a+b

sum(25,38)print("全局变量修改后的值为:%d"%total)【例5-2】运行结果全局变量初始值为:0全局变量修改后的值为:635.3变量的作用域虽然全局变量的作用范围是全部程序,但是不建议多用全局变量。全局变量的使用降低了软件的质量,使程序的调试、维护变得困难。2023年9月23日26在函数内部使用全局变量,如果只是引用其值,则可以直接使用;如果需要修改全局变量的值,则需要使用关键字”global”进行说明之后才能修其值。当局部变量和全局内变量同名时,那么在局部变量作用域内会隐藏全局变量。如【例5-1】的r,在函数circle()内部时,是局部变量r有效。125.3变量的作用域2023年9月23日27Python程序设计5.1函数基础5.2函数参数5.3变量的作用域5.4函数设计精选案例小结2023年9月23日29第五章设计自己的积木块—函数2023年9月23日30【例5-3】编写一个计算梯形面积的函数。分析:最基本的梯形面积计算公式是:s梯=(上底+下底)×高÷2。因此需要三个参数即上底、下底和高。返回值就是所计算的面积。#eg5_3.py#writebyding#2018-5-8

importmathdeft_Area(a,b,h):#对输入的参数进行检查,确保是数值ifisinstance(a,(int,float))andisinstance(b,(int,float))\andisinstance(h,(int,float)):s=(a+b)*h/2returnselse:print("必须输入的是整数或实数。")

print(t_Area(5,8,4))print(t_Area(5,8,’k’)5.4函数设计精选案例2023年9月23日31【例5-4】编写一个函数,对所接收字符串中大小写字母个数进行统计,并将统计结果按先大写后小写字母的个数,采用元组的形式进行返回。分析:函数的参数是一个字符串,返回值是两个整数,用元组的形式进行返回。#eg5_4.py#writebyding#2018-5-8

defs_Count(s):t=[0,0]forchins:ifch.isupper():t[0]+=1elifch.islower():t[1]+=1returntuple(t)

print(s_Count("aA12KmlyuL08!#R"))5.4函数设计精选案例2023年9月23日32【例5-5】编写一函数,判断一个正整数是否是素数,如果是则返回True,否则返回False。#eg5_5.py#writebyding#2018-5-8importmathdefprime_judg(s):#由于range()不包含终值,所以要加1foriinrange(2,int(math.sqrt(s))+1):ifs%i==0:breakelse:returnTruereturnFalse

print(prime_judg(13))print(prime_judg(17))print(prime_judg(15))5.4函数设计精选案例2023年9月23日33【例5-6】编写一函数,要求接收一个正的偶数,输出两个素数,并且这两个素数之和等于原来的正偶数。如果存在多组符合条件的素数,则全部输出。分析:函数的参数是一个正偶数,函数的功能是输出全部素数组合,不需要返回值。#eg5_6.py#writebyding#2018-5-8importeg5_5defeven_dec(m):ifm%2==0andm>0:#range()的终止值是int(m/2)+1,不能超过此值,否则会有重复的输出foriinrange(3,int(m/2)+1):ifi%2==1andeg5_5.prime_judg(i)andeg5_5.prime_judg(m-i):print("%d=%d+%d"%(m,i,m-i))

even_dec(34)【例5-6】中调用了【例5-5】的函数,因此调试时,需要把【例5-5】函数的代码导入,即importeg5_5。5.4函数设计精选案例2023年9月23日34【例5-7】微信抢红包很能吸引人,特别是抢到红包的人很开心。那么请编写一个函数来模拟微信红包金额的分配。分析:微信红包在发的时候,需要给定红包个数和总金额,因此函数的参数是2个。红包发完后,返回每个红包值(列表)。本函数关键需要解决的问题是:每个红包的金额一般是不相同的,也是不确定的。此处需要使用Python自带的random(随机数)模块,产生随机的红包金额。#eg5_7.py#writebyding#2018-5-8importrandomdefhongbao(total,num=10):#total代表总金额,num代表红包个数,默认为10个红包#list记录已经发的每个红包金额list=[]#记录已发红包的总金额sum=0foriinrange(num):#随机产生红包金额在1~剩余金额-剩余红包数,确保最后一个红包至少有1分钱ifi==num-1: t=total-sumelse: t=random.randint(1,(total-sum)-(

温馨提示

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

评论

0/150

提交评论