通过函数进行封装,使用时直接调用该函数即可
def sum_two_nums(): a=23 b=45 result=a+b print(result) sum_two_nums()练习: 定义一个函数,输出自己的姓名和年龄,并且可以定义该函数
def print_mess(): name=input('请输入姓名:') age=input('请输入年龄:') print('姓名:%s,年龄:%s'%(name,age)) print_mess() 函数的参数1)定义带有参数的函数 形参:定义函数时,()小括号中的内容;用来接收实参中的内容。 实参:调用函数时,()小括号中的内容 eg1:
def sum_two_nums(a,b): result=a+b print(result) #调用函数:29赋值给a,78赋值给b sum_two_nums(29,78)2)调用带有参数的函数 eg2:求三角形周长
#abc为形参 def print_perimeter(a,b,c): per=a+b+c print('三角形的周长是:%d'%per) #调用三个实参 print_perimeter(3,4,5)3)调用函数时参数的顺序
函数的返回值 1)定义:返回值就是程序中完成一件事情之后,最后给调用者的结果 2)带有返回值的函数:在函数中把结果返回给调用者,需要在函数中使用return return相当于循环中的break,即在函数中,只要遇到return,就结束。eg3:
def print_perimeter(a,b,c): per=a+b+c return per print('三角形的周长:') #不会执行 #调用三个实参 per=print_perimeter(3,4,5) print(per)如果返回多个返回值,则可以将多个返回值组成列表、元组等,或用逗号将返回值分隔。
3)保存函数的返回值: def add(a,b): return a+b #思考:能不能返回多个值 result = add(11,15) print(result)
函数的类型 根据参数、返回值 ①无参数,有返回值 def A(): pass ②无参数,有返回值 def A(): return ③有参数,无返回值 def A(a): pass ④有参数,有返回值 def A(a): return
函数的参数(补充) 1)缺省参数:在调用时,缺少参数,但是缺少的参数在定义函数时,已经赋值给它了 在调用函数时,如果没有给这个参数赋值,则使用定义函数中这个参数的默认值,否则会报错 在调用函数时,如果调用过程中给出了这个参数的值,并且在定义时也赋值了,则使用调用函数中的值。
eg5:
def add(a,b,c,d=22): print(a) print(b) print(c) print(d) add(33,56,21)2)不定长参数 在调用函数时,参数个数不确定,所以需要在定义不定长参数时,用*表示可以接收的参数个数为n个,前的参数,需确定个数,且必须传入;后的参数则放入一个元组中。 args 是有特殊含义的参数:表示不定长的参数,将后面写的都存在一个元组中。 在不定长参数中: 一个代表元组 两个 代表字典 eg6:
def add_nums(a,b,c,*args): result=a+b+c #后面的n个都合成一个元组,合成args print(args) for temp in args: result+=temp print('resule=%d'%result) add_nums(2,6,8,34,5,21,32)2,6,8为a,b,c的参数值 34, 5, 21, 32为*后的参数,放在一个元组中
eg7:
def print_num(a,b,c,*args,**kwargs): result=a+b+c print() print(args) print(kwargs) print('resule=%d' % result) print_num(32,41,26,11,23,51,5,'dfs',name='chen',age=23)一个函数里面调用了另一个函数,就是函数嵌套。 eg8:
def A(): print('这是函数A') #控制台打印 def B(): print('这是函数B') A() #调用A print('end') #调用B B()2. 函数嵌套的应用
1)打印图形 ①写一个函数打印一条横线
def print_one_line(): print('-'*30) print_one_line()②打印自定义行数的横线
def print_one_line(): print('-'*30) def print_num_lines(a): i=0 while i<a: print_one_line() i+=1 print_num_lines(3)打印3行
2)数学计算 ①写一个函数求三个数的和
def sum_three_num(a,b,c): result=a+b+c print('和是:%d'%result) sum_three_num(19,42,33)②写一个函数求三个数的平均值 #求平均值
def sum_three_num(a,b,c): result=a+b+c return result #result赋值给sum1 def avg_three_num(a,b,c): sum1=sum_three_num(a,b,c) avg=sum1/3 #sum1/3赋值给avg print('平均值是:%d'%avg) #调用avg avg_three_num(23,53,41)1)局部变量:在函数内部定义的变量 ,定义在函数体内 不同的函数可以定义相同的名字的局部变量 为了临时保存数据,在函数中定义变量进行存储 2)全局变量:在函数外部定义的变量,必须定义在函数调用之前的任意位置 如果一个变量,既能在一个函数中使用,也能在其他函数中使用,就是全局变量
a=10 def A(): a=10 print(a) def B(): print(a) A() B() 全局变量和局部变量名字相同探讨当局部变量和全局变量名字相同时,在函数中怎样进行调用? 当函数中有自己的变量时,则使用自己的局部变量 当函数中没有自己的变量时,则使用全局变量。
a=20 def A(): a=10 #刚好变量名相同,并没有修改 print(a) def B(): print(a) A() B() 修改全局变量全局变量能在所有函数中使用,当局部变量和全局变量名称一样时,若想在函数中将局部变量修改成全局变量,则使用global 如果在程序中,没有全局变量,可以在函数中通过global设置某个变量为全局变量
a=20 def A(): global a #设置成全局变量 a=15 #刚好变量名相同,并没有修改 print(a) def B(): print(a) A() B()递归函数:如果一个函数在内部不调用其他的函数,而是自己本身 例子:计算阶乘n! = 1 * 2 * 3…n eg:
def num(a): # 5 4 3 2 1 if a>1: result=a*num(a-1) #5*num(4) 5*4*num(3) 5*4*3*num(2) 5*4*3*2*num(1) else: result=1 return result # =5*4*3*2*1 res=num(5) #5的阶乘 print(res) def calc(n): print(n) if int(n/2)==0: return n res=calc(int(n/2)) return res res=calc(10) print(res)2. 匿名函数
匿名函数:用lambda关键字创建一个函数,省略了用def定义函数的标准步骤 用法:lambda [arg1,arg2,argn]:expression 调用: 匿名函数返回的是一个表达式的值,所以需要用一个变量接收 匿名函数(参数值) 匿名函数的使用: 作为函数,可直接实现想要的功能 作为函数的参数,在调用的时候把lambda式子传递给函数的参数 作为内置函数的参数
def add_num(a,b): return a+b res=lambda a,b:a+b print(res(3,5))自己定义的函数
def fun(a,b,opt): print('a=%d'%a) print('b=%d'%a) print('result=%d'%opt(a,b)) fun(1,2,lambda x,y:x+y)作为内置函数的参数:下面的数据如何指定按age或name排序?
students=[{'name':'xiaoli','age':23},{'name':'xiaozhao','age':20},{'name':'xiaozhang','age':28}] #按照年龄倒序排列 students.sort(key=lambda x:x['age'],reverse=True) print(students) #字符串拼接 def name(username): print('miss_'+username) name('zhang') #自定义字符串 def str_name(n1,n2,test): print(n1) print(n2) print(test(n1,n2)) str_name('zhang','xiaoming',lambda m,n:m+n) def add_sum(a,b,fun): return fun(a,b) fun_new=input('请输入一个lambda表达式:') fun_new=eval(fun_new) #需要用eval转化成函数 res=add_sum(3,4,fun_new) print(res)自定义函数 一个函数到底有没有返回值,就看有没有return,因为只有return才可以返回数据 在开发中往往根据需求来设计函数需不需要返回值 函数中,可以有多个return语句,但是只要执行到一个return语句,那么就意味着这个函数的调用完成 在调用函数时,如果需要把一些数据一起传递过去,被调用函数就需要用参数来接收 参数列表中变量的个数根据实际传递的数据的多少来确定
调用函数 调用方式:函数名([实参列表]) 如果调用的函数在定义时有形参,那么在调用的时候就应该传递参数 调用时,实参的个数和先后顺序应该和定义函数中要求的一致 如果调用的函数有返回值,那么就可以用一个变量来进行保存这个值
作用域 在一个函数中定义的变量,只能在本函数中用(局部变量) 在函数外定义的变量,可以在所有的函数中使用(全局变量)