函数是带名字的代码块。
要执行函数定义的特定任务,可调用该函数。
需要在程序中多次执行同一任务时,你无需反复编写完成该任务的代码,而只需要调用执行该任务的函数,让Python运行其中的代码。
你将发现,通过使用函数,程序的编写、阅读、测试和修复都将更容易。
1、定义函数
def 定义的函数名称(参数):
函数内容
(return)
由def引出函数名称,括号里加入相应的参数,以冒号结束定义。
函数内容通过缩进进行表达。
2、函数的返回值
函数返回值有如下三种情况:
①没有返回值:
#1)不写return def func(): print('123') #2)只写return:后面没有东西,结束一个函数。其返回值为‘None’ def func1(): return #返回值为None
②返回一个值:
#1)可以返回任何数据类型 def func(): return'123' def func1(): return[123] def func2(): return(1,2,3) def func3(): return{'k1':1,'k2':2,'k3':3} #2)只要返回,就可以收到 def func4(): return'你好' #返回值: 你好 #3)有多个return,返回第一个return的值d def func5(): return 1 return'不是1' 返回值: 1
③返回多个值
#1)多个返回值用多个变量接收,有多少返回值就用多少变量接收; def func(): return 1,2,3 a,b,c = func() print(a,b,c) #返回值: 1 2 3 #2)多个返回值用一个变量接收,接收值为一个元组 def func1(): return 1,2,3 a= func() print(a) #返回值: (1, 2, 3)
3.多个参数传递情况
站在实参的角度上:
按照位置传参
按照关键字传参
混着用可以:但是 必须先按照位置传参,再按照关键字传参数
不能给同一个变量传多个值
站在形参的角度上
位置参数:必须传,且有几个参数就传几个值
默认参数: 可以不传,如果不传就是用默认的参数,如果传了就用传的
只有调用函数的时候
按照位置传 : 直接写参数的值
按照关键字: 关键字 = 值
定义函数的时候:
位置参数 : 直接定义参数
默认参数,关键字参数 :参数名 = '默认的值'
动态参数 : 可以接受任意多个参数
参数名之前加*,习惯参数名args,
参数名之前加**,习惯参数名kwargs
顺序:位置参数,*args,默认参数,**kwargs
动态参数的另一种传参方式:
1 def func(*args): #形参角度上:给变量加上*,就是组合所有传来的值 2 print(args) #将值分别打印出来 3 l = [1,2,3,4,5] 4 func(*l) #返回值为(1,2,3,4,5) 5 6 7 #站在实参的角度上,给一个序列加上*,就是将这个序列按序打散开,传给形参
1 def func(**kwargs): 形参角度上:给变量加上**,就是组合所有传来的值 2 print(kwargs) 3 d = {'a':1,'b':2} 4 func(**d) #返回值:{'a':1,'b':2} 5 6 7 #实参出啊如的是打散的字典,通过函数调用,最终返回原字典
默认参数的陷阱:
def qqxing(l=[]): #定义函数里有一个默认参数l l.append('你好') print(l) qqxing() #返回值: ['你好'] qqxing() #返回值:['你好', '你好'] #默认参数随着函数的不断调用,会保存先前的数据,从而偏离需求 解决方案: def qqxing(l=None): if not l: l = [] else: l = l l.append('你好') print(l) qqxing() qqxing(l = [1,2,3,4,5]) qqxing()