目录
1.创建和调用函数
创建函数的形式:def 函数名(参数s):+ 函数的功能 +返回值
例如:我们要创建多次打印的函数。
def csdn(name):
for i in range(3):
print(f"I love {name}.")
csdn("csdn")
>>>I love csdn.
>>>I love csdn.
>>>I love csdn.
2.函数的返回值
例如:sum()函数返回求和之后的结果,len()函数返回函数的长度等等。
那么函数内部的返回值用return表示,例如:
def div(x,y):
z = x/y
return z
div(4,2) #函数的调用
>>>2.0
#同时也可以写成
def div(x,y):
return x/y
div(6,2)
>>>3.0
注意:当函数中有多个return语句,则当执行第一句return语句之后就跳出该函数。
3.参数
3.1实际参数和形式参数
参数分为实际参数(实参)和形式参数(形参)两种类型,其中实参是根据形参定义的顺序进行传递的。
例如:
def myfunc(a,b,c):
return "".join(c,b,a)
myfunc("你","我","他")#实参根据形参的顺序进行传递
>>>'他我你'
3.2位置参数和关键字参数
对于此类位置固定的参数,我们称为位置参数。
此外我们可以使用关键字参数进行准确的传参,例如:
def myfunc(a,b,c):
return "".(c,b,a)
myfunc(c="你",b="我",a="他")
>>>'你我他'
在同时使用关键字参数和位置参数的时候,位置参数必须在关键字参数之前,例如:
def myfunc(a,b,c):
return "".(c,b,a)
myfunc(c="你","我","他")
>>>SyntaxError: positional argument follows keyword argument#报错
myfunc("他","我",c="你")#位置参数在关键字参数之后则不会报错
>>>'你我他'
在定义函数的时候,可以使用默认参数,如果在进行函数调用的时候,没有传入实参,则为默认参数。例如:
def myfunc(a,b,c="它"):
return "".join((a,b,c))
myfunc("你","我")#如果没有实参传递,则由默认参数输出
>>>'你我它'
myfunc("你","我","他")#如果有实参传递,则代替默认参数输出
>>>'你我他'
注意:在使用默认参数的时候要将默认参数放在参数最后,否则会报错,例如:
def myfunc(a="你",b,c):
>>>SyntaxError: non-default argument follows default argument
#语法错误:非默认参数跟在默认参数后面
3.3参数的限制"/","*"
函数的参数还有一个成员,那就是"/",其作用是限制关键字参数的语法。例如:
"/"表示在其左侧不能使用关键字参数,右侧可以使用关键字和位置参数。例如:
def mul(x,/,y):
return x*y
mul(5,6)
>>>30
mul(x=5,6)
>>>SyntaxError: positional argument follows keyword argument
def mul(x,y):
return x*y
mul(x=5,y=6)
>>>30
与"/"类似,"*"其作用是限制位置参数的语法。表示其左侧可以是位置参数也可以是关键字参数,但右侧只能是关键字参数。例如:
def mul(x,*,y):
return x*y
mul(5,3)
>>>Traceback (most recent call last):
File "<pyshell#33>", line 1, in <module>
mul(5,3)
TypeError: mul() takes 1 positional argument but 2 were given
mul(x=5,y=3)
>>>15
3.4收集参数之(*)和(**)的使用方式
3.4.1(*)与形参结合
表示为将实参在未被关键字参数和位置参数使用的情况下,对实参进行打包成元组,例如:
def myfunc(*args):
print(args)
myfunc(1,2,3,4,5,6)
#由于传入多个实参,而形参又与*结合,所有*args对所有的实参进行打包,变成元组的形式
>>>(1, 2, 3, 4, 5, 6)
当实参中存在关键字参数的时候,则*args只对关键字参数之前的实参进行打包成元组,例如:
def myfunc(*args,a,b):
print(args,a,b)
myfunc(1,2,3,4,5,a=6,b=7)#*args对1,2,3,4,5打包成元组
>>>(1, 2, 3, 4, 5) 6 7
注意:如果在收集参数后面还需要指定一些参数,那么在函数调用的过程中则需要使用关键字参数来指定该实参,否则会报错。例如:
def myfunc(*args,a,b):
print(args,a,b)
myfunc(1,2,3,4,5,6,7)
#六个实参都被打包成元组,导致a和b两个形参没有接收到实参,也没有默认参数,则系统报错
>>>Traceback (most recent call last):
File "<pyshell#46>", line 1, in <module>
myfunc(1,2,3,4,5,6,7)
TypeError: myfunc() missing 2 required keyword-only arguments: 'a' and 'b'
myfunc(1,2,3,4,5,a=6,b=7)
#使用关键字参数可以避免以上情况
>>>(1, 2, 3, 4, 5) 6 7
3.4.2(**)与形参结合
表示为将实参在未被关键字参数和位置参数使用的情况下,对实参进行打包成字典。
注意:由于字典中的键值对是成对存在的,所有在传入实参的过程中必须使用关键字参数。
例如:
def myfunc(**args):
print(args)
myfunc(x=1,y=2)
>>>{'x': 1, 'y': 2}#字典
myfunc(1,2)
>>>Traceback (most recent call last):#报错
File "<pyshell#52>", line 1, in <module>
myfunc(1,2)
TypeError: myfunc() takes 0 positional arguments but 2 were given
最后,收集函数的两种形式可以同时出现在一个函数,比如format函数:
3.4.3解包参数
在函数调用的时候运用(*)(**)与实参结合,则称为解包参数。例如:
args = (1,2,3,4)
def myfunc(a,b,c,d):
print(a,b,c,d)
myfunc(args)#报错,由于函数myfunc需要传入四个参数,而args是一个元组,只传入一个参数
>>>Traceback (most recent call last):
File "<pyshell#58>", line 1, in <module>
myfunc(args)
TypeError: myfunc() missing 3 required positional arguments: 'b', 'c', and 'd'
myfunc(*args)#*args表示将元组进行解包,然后进行传参
>>>1 2 3 4
kwargs = {'a':1,'b':2,'c':3,'d':4}
def myfunc(a,b,c,d):
print(a,b,c,d)
myfunc(kwargs)
>>>Traceback (most recent call last):#报错,同上,该参数是一个字典,表一个参数
File "<pyshell#64>", line 1, in <module>
myfunc(kwargs)
TypeError: myfunc() missing 3 required positional arguments: 'b', 'c', and 'd'
myfunc(*kwargs)#对字典进行解包一次
>>>a b c d
myfunc(**kwargs)#对字典进行解包两次
>>>1 2 3 4