版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Python数据分析与科学计算第5章函数与模块
5.1函数概述
5.2函数的定义与调用5.3函数的参数及返回值5.4函数的嵌套调用和递归调用5.5匿名函数5.6变量的作用域5.7模块5.8函数应用举例
函数是一组实现某一特定功能的语句集合,是可以重复调用、功能相对独立完整的程序段。5.1函数概述用户自定义函数1)
从用户的使用角度函数分类标准库函数(标准函数)2)
从参数传递的角度有参函数无参函数5.2函数的定义与调用def
函数名([形式参数表]):函数体
[return表达式]采用def关键字定义函数,不需要指定返回值的类型;函数的参数不限,不需要指定参数类型;参数括号后面的冒号“:”必不可少;函数体相对于def关键字必须保持一定的空格缩进;return语句是可选的;允许定义函数体为空的函数。函数定义时要注意1.函数定义一般形式:函数名([实际参数表])2.函数的调用说明实参可以是常量、变量、表达式、函数等,但在进行函数调用时必须有确定的值。对于无参函数,调用时实参表列为空,但()不能省。5.2函数的定义与调用【例5.3】编写函数,求3个数中的最大值。5.2函数的定义与调用程序代码:defgetMax(a,b,c):ifa>b:max=aelse:max=bif(c>m):max=creturnmaxa,b,c=eval(input("inputa,b,c:"))n=getMax(a,b,c)print("max=",n)运行结果:inputa,b,c:10,43,23max=43形式参数:定义函数时函数名后面括号中的变量名实际参数:调用函数时函数名后面括号中对应的参数5.3函数的参数和函数的返回值1.形式参数和实际参数根据实参传递给形参值的不同,通常有值传递和地址传递两种方式。值传递方式
所谓值传递方式是指在函数调用时,为形参分配存储单元,并将实参的值复制到形参;函数调用结束,形参所占内存单元被释放,值消失。其特点是:形参和实参各占不同的内存单元,函数中对形参值的改变不会改变实参的值。这就是函数参数的单向传递规则。5.3函数的参数和函数的返回值【例5.4】
函数参数的值传递方式。程序代码:defswap(a,b):a,b=b,aprint("a=",a,"b=",b)
x,y=eval(input("inputx,y:"))swap(x,y)print("x=",x,"y=",y)运行结果:inputx,y:3,5a=5b=3x=3y=55.3函数的参数和函数的返回值图5.1函数参数值传递方式5.3函数的参数和函数的返回值地址传递方式
所谓地址传递方式是指在函数调用时,将实参数据的存储地址作为参数传递给形参。其特点是:形参和实参占用同样的内存单元,函数中对形参值的改变也会改变实参的值。【例5.5】
函数参数的地址传递方式。程序代码:defswap(a_list):a_list[0],a_list[1]=a_list[1],a_list[0]print("a_list[0]=",a_list[0],"a_list[1]=",a_list[1])
x_list=[3,5]swap(x_list)print("x_list[0]=",x_list[0],"x_list[1]=",x_list[1])运行结果:a_list[0]=5a_list[1]=3x_list[0]=5x_list[1]=35.3函数的参数和函数的返回值2.默认值参数默认值参数机制,可以为函数的参数提供默认值。定义带有默认值参数额函数一般形式为:def函数名(非默认参数,参数名=默认值,…):
函数体
函数定义时,形式参数中非默认参数和默认参数可以并存,但非默认参数之前不能有默认参数。5.3函数的参数和函数的返回值2.默认值参数可以使用函数__defaults__查看函数所有默认值参数的当前值。例如:defmul(x,y=2,z=3):return(x*y*z)
使用__defaults__查看mul函数的默认值参数,语句为:>>>mul.__defaults__(2,3)可以看到该函数调用返回值为元组(2,3)。对mul函数的调用:mul(5)30mul(2,4)24mul(2,4,6)485.3函数的参数和函数的返回值在定义含有默认参数的函数时,需要注意:
所有位置参数必须出现在默认参数前,包括函数调用。默认参数的值只在定义时被设置计算一次。如果函数修改了对象,默认值就被修改了。【例5.6】
默认参数应用举例。程序代码:deffunc(x,n=2):f=1foriinrange(n):f*=xreturnf
print(func(5))#函数调用时n传入默认参数print(func(5,3))#函数调用时x和n均传入非默认参数运行结果:251255.3函数的参数和函数的返回值【例5.7】可变默认参数。【例5.8】
不可变默认参数。程序代码:deffunc(x,a_list=[]):a_list.append(x)returna_list
print(func(1))print(func(2))print(func(3))运行结果:[1][1,2][1,2,3]程序代码:deffunc(x,a_list=None):ifa_list==None:a_list=[]a_list.append(x)returna_list
print(func(1))print(func(2))print(func(3))运行结果:[1][2][3]5.3函数的参数和函数的返回值3.位置参数和关键字参数位置参数deffunc(a,b):c=a**breturnc在函数调用时,实参默认采用按照位置顺序传递给形参的方式。关键字参数指定参数:键=值【例5.9】使用关键字参数应用举例。程序代码:deffunc(a,b):c=a**breturnc
print(func(a=2,b=3))print(func(b=3,a=2))运行结果:[1][1,2][1,2,3]
一个函数可能在调用时需要使用比定义时更多的参数,这就需要使用可变长参数。使用方法是在变量名前加星号*或**。4.可变长参数5.3函数的参数和函数的返回值程序代码:deffunc(*para_t):print("可变长参数数量为:")print(len(para_t))print("参数依次为:")
forxinrange(len(para_t)):print(para_t[x]);#访问可变长参数内容
func('a') #使用单个参数func(1,2,3,4) #使用多个参数运行结果:可变长参数数量为:1参数依次为:a可变长参数数量为:4参数依次为:1234元组【例5.10】以元组作为可变长参数实例。【例5.12】调用函数使不指定可变长参数。【例5.13】使用不同形式的可变长参数实例。5.3函数的参数和函数的返回值程序代码:deffunc(*para_a):sum=0forxinpara_a:sum+=xreturnsum
print(func())运行结果:0程序代码:func(para,*para_a,**para_b):print("para:",para)forvalueinpara_a:print("otherpara:",value)forkeyinpara_b:print("dictpara:{0}:{1}".format(key,para_b[key]))
func(1,'a',True,name='Tom',age=12)运行结果:para:1otherpara:aotherpara:Truedictpara:name:Tomdictpara:age:12【例5.14】可变长参数与默认参数、位置参数同时使用。5.3函数的参数和函数的返回值程序代码:deffunc(x,*para,y=1):#默认参数要放到最后
print(x)print(para)print(y)
func(1,2,3,4,5,6,7,8,9,10,y=100)运行结果:1(2,3,4,5,6,7,8,9,10)1005.函数的返回值
指函数被调用、执行完后,返回给主调函数的值。函数的返回语句一般形式
return表达式功能:
使程序控制从被调用函数返回到调用函数中,同时把返回值带给调用函数defadd(a,b):c=a+b
x=add(3,20)print(x)说明
函数内可有多条返回语句。如果没有return语句,会自动返回NONE;如果有return语句,但是return后面没有表达式也返回NONE。5.3函数的参数和函数的返回值【例5.15】编写函数,判断一个数是否是素数。5.3函数的参数和函数的返回值程序代码:defisprime(n):foriinrange(2,n):if(n%i==0):return0return1m=int(input("请输入一个整数:"))flag=isprime(m)if(flag==1):print("%d是素数"%m)else:print("%d不是素数"%m)运行结果:请输入一个整数:3535不是素数再次运行程序结果如下:请输入一个整数:55是素数【例5.16】求一个数列中的最大值和最小值。5.3函数的参数和函数的返回值程序代码:defgetMaxMin(x):max=x[0]min=x[0]foriinrange(0,len(x)):ifmax<x[i]:max=x[i]ifmin>x[i]:min=x[i]return(max,min)a_list=[-1,28,-15,5,10]#测试数据为列表类型x,y=getMaxMin(a_list)print("a_list=",a_list)print("最大元素=",x,"最小元素=",y)string="Hello"#测试数据为字符串x,y=getMaxMin(string)print("string=",string)print("最大元素=",x,"最小元素=",y)运行结果:a_list=[-1,28,-15,5,10]最大元素=28最小元素=-15string=Hello最大元素=o最小元素=H5.4函数的嵌套调用和递归调用
在函数的执行过程中又直接或间接地调用该函数本身,这就是函数的递归调用,Python中允许递归调用。在函数中直接调用函数本身称为直接递归调用。在函数中调用其他函数,其他函数又调用原函数,称为间接递归调用。函数的递归调用如图5.3所示。图5.3函数的递归调用【例5.17】用递归方法求n!递推归纳:递归终止:5.4函数的嵌套调用和递归调用程序代码:deffac(n):ifn==0:f=1else:f=fac(n-1)*n;returnfn=int(input("pleaseinputn:"))f=fac(n)print("%d!=%d"%(n,f))运行结果:pleaseinputn:44!=2402十二月2024【例5.18】汉诺塔问题。
假设有三个塔座,分别用A、B、C表示,在一个塔座(设为A塔)上有64个盘片,盘片大小不等,按大盘在下,小盘在上的顺序叠放着,如图5.5所示。现要借助于B塔,将这些盘片移到C塔去,要求在移动的过程中,每个塔座上的盘片始终保持大盘在下,小盘在上的叠放方式,每次只能移动一个盘片。编程实现移动盘片的过程。5.4函数的嵌套调用和递归调用图5.5汉诺(Hanoi)塔问题
假设要将n个盘片按规定从A塔移至C塔,移动步骤可分为以下3步完成。(1)把A塔上的n-1个盘片借助C塔移动到B塔。(2)把第n个盘片从A塔移至C塔。(3)把B塔上的n-1个盘片借助A塔移至C塔。
算法用函数hanoi
(n,x,y,z)以递归算法实现,hanoi()
函数的形参为n、x、y、z,分别存储盘片数、源塔、借用塔和目的塔。调用函数每调用一次,可以使盘片数减1,当递归调用盘片数为1时结束递归。算法描述如下。如果n等于1,则将这一个盘片从x塔移至z塔,否则有:(1)递归调用hanoi
(n-1,x,z,y),将n-1个盘片从x塔借助z塔移动到y塔。(2)将n号盘片从x塔移至z塔。(3)递归调用hanoi(n-1,y,x,z),将n-1个盘片从y塔借助x塔移动到z塔。5.4函数的嵌套调用和递归调用程序代码:count=0defhanoi(n,x,y,z):globalcountifn==1:count+=1move(count,x,z)else:hanoi(n-1,x,z,y);count+=1move(count,x,z)hanoi(n-1,y,x,z);defmove(n,x,y):print("step%d:Movediskform%cto%c"%(count,x,y))m=int(input("Inputthenumberofdisks:"))print("Thestepstomoving%ddisks:"%m)hanoi(m,'A','B','C')运行结果:Inputthenumberofdisks:3Thestepstomoving3disks:step1:MovediskformAtoCstep2:MovediskformAtoBstep3:MovediskformCtoBstep4:MovediskformAtoCstep5:MovediskformBtoAstep6:MovediskformBtoCstep7:MovediskformAtoC5.4函数的嵌套调用和递归调用图5.6n=3时函数的递归调用过程5.5匿名函数通过lambda关键字来定义的函数称为匿名函数。定义格式如下:lambda[参数1[,参数2,参数3,…,参数n]]:表达式表达式相当于匿名函数的返回值,但只能由一个表达式组成,不能有其他的复杂结构。例如有以下定义:lambdax,y:x+y该函数有两个参数,分别是x、y。lambda函数是一个函数对象,可将该函数直接赋值给一个变量,这个变量就成了一个函数对象,也就是将函数与变量捆绑到一起了,函数对象名可以作为函数直接调用。例如:f=lambdax,y:x+yprint(f(2,3))
5.5匿名函数【例5.19】求正方形的面积。分析:分别使用匿名函数和普通函数求面积。#普通函数defsquare(x):returnx*x#匿名函数lambda_square=lambdax:x*x#函数调用print(square(10))print(lambda_square(10))【例5.20】匿名函数的多种使用形式。5.5匿名函数程序代码:#无参数lambda_a=lambda:"Computer"print(lambda_a())
#一个参数lambda_b=lambdan:n*1001print(lambda_b(5))
#多个参数lambda_c=lambdaa,b,c,d:a+b+c+dprint(lambda_c(1,2,3,4))#嵌套条件分支lambda_d=lambdax,y:xifx>yelseyprint(lambda_d(3,5))#作为函数参数deffunc1(a,b,func):print('a=',a)print('b=',b)print('a*b=',func(a,b))
func1(3,5,lambdaa,b:a*b)#作为函数的返回值deffunc2(a,b):returnlambdac:a*b*creturn_func=func2(2,4)print(return_func(6))运行结果:Computer5005105a=3b=5a*b=15485.6变量的作用域当程序中有多个函数时,定义的每个变量只能在一定的范围内访问,称之为变量的作用域。按作用域划分,将变量分为局部变量和全局变量。1.局部变量
在一个函数内或者语句块内定义的变量称为局部变量。局部变量的作用域仅限于定义它的函数体或语句块中。deffun1(a):x=a+10……deffun2(a,b):x,y=a,b……5.6变量的作用域【例5.21】局部变量应用。程序代码:deffun(x):print("x=",x)x=20print("changedlocalx=",x)x=30fun(30)print("mainx=",x)运行结果:x=30changedlocalx=20mainx=302.全局变量在所有函数之外定义的变量称为全局变量,它可以在多个函数中被引用。x=30deffunc():globalxprint('x的值是',x)x=20print('全局变量x改为',x)func()print('x的值是',x)5.6变量的作用域5.6变量的作用域【例5.22】全局变量应用。程序代码:x=30deffunc():globalxprint('x的值是',x)x=20print('全局变量x改为',x)func()print('x的值是',x)运行结果:x的值是30全局变量x改为20x的值是20 5.7模块
将一些常用的功能单独放置到一个文件中,方便其他文件来调用,这些文件即为模块。标准库模块是Python自带的函数模块。文本处理文件处理操作系统功能网络通信网络协议
从用户的角度看,模块也分为标准库模块和用户自定义模块。标准库模块1.定义模块用户建立一个模块就是建立扩展名为.py的Python程序。defprinter(x):print(x)将以上程序代码保存成.py程序,例如module.py用户自定义模块5.7模块导入模块就是给出一个访问模块提供的函数、对象和类的方法。(1)引入模块import模块(2)引入模块中的函数
from模块名import函数名(3)引入模块中的所有函数from模块名import*2.导入模块5.7模块5.8函数应用举例【例5.24】采取插入排序法将10个数据从小到大进行排序。程序代码:definsert_sort(array):foriinrange(1,len(array)):ifarray[i-1]>array[i]:temp=array[i]#当前需要排序的元素暂存到temp中
index=i#用来记录排序元素需要插入的位置
whileindex>0andarray[index-1]>temp:array[index]=array[index-1]#把已经排序好的元素后移一位,留下需要插入的位置
index-=1array[index]=temp#把需要排序的元素,插入到指定位置b=input("请输入一组数据:")array=[]foriinb.split(','):array.append(int(i))print("排序前的数据:")print(array)insert_sort(array)#调用insert_sort()函数print("排序后的数据:")print(array)运行结果:请输入一组数据:100,43,65,101,54,65,4,2017,123,55排序前的数据:[100,43,65,101,54,65,4,2017,123,55]排序后的数据:[4,43,54,55,65,65,100,101,123,2017]【例5.25】用递归的方法求xn。递推归纳:递归终止:xn→xn-1→xn-2→…→x2→x1当n=0时,x0=15.8函数应用举例程序代码:defxn(x,n):ifn==0:f=1else:f=x*xn(x,n-1)returnfx,n=eval(input("pleaseinputxandn"))ifn<0:n=-ny=xn(x,n)y=1/yelse:y=xn(x,n)print(y)运行结果:pleaseinputxandn:3,5243再次运行程序结果如下:pleaseinputxandn:3,-50.00411522633744856【例5.26】计算从公元1年1月1日到y年m月d日的天数(含两端)。例如:从公元1年1月1日到1年2月
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 全新2024年上海劳动局公积金缴纳合同3篇
- 包含2024年度的二手房屋居间交易合同3篇
- 网络舆情应急处置
- 2024年骨科专科护理工作个人年度总结
- 客户精细化分析及管理
- 房屋及土地使用权买卖合同20243篇
- 二零二四年度房产共有权转移合同
- 二零二四年城市轨道交通建设与运营管理合同2篇
- 玉林师范学院《基础泰语》2021-2022学年第一学期期末试卷
- 玉林师范学院《复变函数》2022-2023学年第一学期期末试卷
- 酒店前台专业术语常见缩写及解释
- 新教科版三年级上册科学 1.2《水沸腾了》 教案
- 潮州市乡镇信息技术教育的现状和对策
- 一体化净水设备安装、调试、运行操维护说明
- tpe、tpr-SGS检测报告(共4页)
- 行政执法程序流程图
- 士林SC系列变频器使用说明书
- 菜籽油生产加工建设项目可行性研究报告
- 工资流水证明
- 《孙子兵法》全文在线阅读
- 教职工健康体检结果汇总分析报告
评论
0/150
提交评论