当前位置: 首页 > Linux

[Python]-7-函数(上)

时间:2023-04-06 19:13:54 Linux

简介本文介绍了python中函数的基础知识。文章目录0×1。自定义函数0×2。向函数0×3添加文档。函数范围0×4。参数为0×1的函数。自定义函数在任何编程语言中,函数的功能都是一样的。它可以将一些需要重复执行的语句组合起来,以便在需要的时候调用。def关键字在python中用于创建函数。请看下面的例子:#!/usr/bin/envpython3#coding=utf-8dect={"one":1,"two":2,"three":3}#创建一个函数,函数名是in_dect,括号中的空格表示没有接收到传入参数,函数执行过程中如果遇到return,则执行结束,return后的值返回给调用者#------defin_dect():"""根据字典输入key返回值"""try:count=dect[num]exceptKeyErroraserr:count=0returncount#------#Setnum到dect字典中不同的key,调用print中刚刚创建的函数,in_dect()函数会根据num个key的值返回对应的key,如果传入的key不存在,会触发KeyError异常and0num="one"print(in_dect())num="two"print(in_dect())num="xxx"print(in_dect())#会返回#程序输出为1200×2。向函数添加文档。我们可以使用“三重引号”为每个函数添加一个函数描述。在python中,这个描述可以通过“函数名.__doc__”打印出来,请看下面的例子:#!/usr/bin/envpython3#coding=utf-8#------defsayhello():"""打印helloworld""""""www.qingsword.com"""print("helloworld!")#------sayhello()#直接调用函数print(sayhello.__doc__)#打印出函数中的描述信息#程序输出helloworld!打印出helloworld#注意上面的Output,__doc__只能打印出函数中第一个“三引号”中包含的描述信息0×3。函数作用域function中的变量名和global中的变量名称可以相同,函数的变量名只在函数内部使用,请看下面的例子:#!/usr/bin/envpython3#coding=utf-8#------defre_list():lst=[1,2,3]returnlst#---lst=["a","b","c"]print(lst,re_list())#在上面的程序中,在re_list()函数中包含一个变量名lst,全局中也有一个同名变量,但两者互不干扰。函数中变量的作用域仅限于函数本身。在调用函数时创建,函数执行后回收。下面是程序输出['a','b','c'][1,2,3]0×4。带参数的函数可以在自定义函数括号中定义变量来接收传入的数据,见下例:#!/usr/bin/envpython3#coding=utf-8#------defre_dect_value(dect,k):returndect[k]#------d={"a":1,"b":2,"c":3}k="a"#调用函数时,将d和k传给函数.定义函数时,括号中包含两个参数,相当于传递函数参数中的dect指向d引用的内存区的数据(列表数据),与k相同,所以取值这个函数的return语句返回的其实相当于d[k]print(re_dect_value(d,k))#程序输出:1可以用判断语句来判断传递给函数的参数的数据类型,以及通过数据类型判断调用不同的功能块执行。如果不带参数,使用默认值指向的块执行,请看下面的例子:#!/usr/bin/envpython3#coding=utf-8#choose_def函数,用于判断类型传入的数据,根据不同的类型调用不同的函数,如果没有传入参数,则使用默认值(即typ="default",idx=0)defchoose_def(typ="default",idx=0):iftype(typ)==type([]):print(c_dect(typ,idx))eliftype(typ)==type(""):print(c_str(typ,idx))#------defc_dect(d,idx):返回urnd[idx]#------defc_str(s,idx):returns[idx]#------lst=[1,2,3,4]s="www.qingsword.com"i=2choose_def(lst,i)choose_def(s,i)choose_def()#程序输出3wd#上面程序中最后一次调用选择函数不带参数,python定义时会使用默认设置函数Value(如果有的话),程序判断“default”是一个字符串,所以调用字符串函数c_str(),因为默认idx为0,所以打印出“default”的第一个字符d#likechoose_def()对于有默认值参数的函数,如果我们只想修改其中一个参数,其他参数沿用默认值,我们可以使用下面的方法调用choose_def(idx=3)#这个调用方法只指定idx和typ的值不设置,将使用默认值。除了使用类型判断,还可以使用字符串判断,通过每次类型判断返回的字符串来判断传入参数的类型。对上面程序中的choose_def函数稍作修改,执行结果相同:#将type()判断后的返回值转换为字符串,并与对应的字符串值进行比较defchoose_def(typ="default",idx=0):ifstr(type(typ))=="":print(c_dect(typ,idx))elifstr(type(typ))=="":print(c_str(typ,idx))当一个错误的数据传给函数时,除了使用try捕获异常,还可以使用raise关键字主动抛出异常,修改choose_def()函数,并在最后添加如下语句:defchoose_def(typ="default",idx=0):ifstr(type(typ))=="":print(c_dect(typ,idx))elifstr(type(typ))=="":print(c_str(typ,idx))else:raiseTypeError("Wrongparameter:%s"%typ)#给函数传递了一个错误的参数,integerchoose_def(123)#程序执行if判断时,发现没有可以匹配传入的类型integer,所以跳转到else去执行后面的raise语句。当执行raise语句时,程序的执行会立即终止并抛出异常。这个异常是我们主动抛出的。下面是这个异常的显示信息,它的中文内容是我们自定义的builtins.TypeError:wrongparameter:123再来看一个例子,创建一个函数,接受两个值,返回这两个值相加的结果:#!/usr/bin/envpython3#coding=utf-8#------如果输入字符不是值,if判断会匹配else抛出异常defa_plus(x,y):"""返回x+y的值"""ifis_Num(x)andis_Num(y):returnfloat(x)+float(y)else:raiseTypeError("输入值错误:%s,%s"%(x,y))#------用于判断输入是否为数值数据,是浮点数、整数还是科学计数法,使用float不会报错()转换,其他字符会引发ValueError异常并返回False。如果没有报错,returnTruedefis_Num(x):"""判断键盘输入是否为数字"""try:float(x)exceptValueError:returnFalseelse:returnTrue#------x=input("第一个数:")y=input("第二个数:")print("相加结果:%.2f"%a_plus(x,y))#程序输出第一个数:1.2第二个number:1.3333相加结果:2.53第一个数:abc第二个数:111builtins.TypeError:输入值错误:abc,111函数除了返回单个值外,还可以一次返回多个值.返回多个值时有时,值实际上以元组的形式返回,例如:#!/usr/bin/envpython3defmy_def(x,y,z):"""一个返回多个值的函数"""returnx,y,z#可以用一个变量来接受这些返回值,实际上x指向一个元组x=my_def(1,2,3)print(x)#也可以使用多个变量指向元组a,b,c=my_def(1,2,3)print(a)print(b)print(c)#Programoutput(1,2,3)123Ps:可能有朋友会问,函数没有return语句怎么办?没有return语句的函数完成后,返回None最后给出求解二次方程组的一个例子:#!/usr/bin/envpython3#coding=utf-8importmathdefquadratic(a,b,c):"""二次方程组的求解"""#当输入为非数值数据时,可以使用异常捕获try,或者下面的方法抛出异常ifnotisinstance(a,(int,float))ornotisinstance(b,(int,float))ornotisinstance(c,(int,float)):raiseTypeError("参数输入错误,a,b,c只能是整数或小数:%s,%s,%s"%(a,b,c))#求判别式disc=b**2-4*a*c#判别式的三种情况ifdisc<0:return"方程无解"elifdisc==0:return"方程有唯一解:"+str(-b/2*a)else:#math模块的sqrt()函数用于求平方根result1=(-b+math.sqrt(disc))/2*aresult2=(-b-math.sqrt(disc))/2*areturn"方程的两个解是:%s,%s"%(str(result1),str(result2))print(quadratic(4,8,4))print(quadratic(2,6,4))print(quadratic(2,3,3))#程序输出方程有唯一解:-16方程的两个解分别是:-4.0,-8.0方程没有解决方法#如果输入一个值错误,会抛出错误信息print(quadratic("a",3,3))TypeError:Thewrongparameterinpassedin,a,b,ccanonlybeintegersor小数:a,3,3