13. 函数的参数
小蛙有话说环节
与诸君共勉,愿诸君明天依旧光芒万丈。好记性不如烂笔头,让我们一起努力。小蛙今天也是收获满满!!!
小声bb环节:我说的很小声你们应该听不见(你们要是不学习,本蛙可就要超过你们了)
1.形参与实参介绍
函数的参数分为形式参数和实际参数,简称形参和实参;
形参即在定义函数时,括号内声明的参数。形参本质就是一个变量名,用来接收外部传来的值。
实参即在调用函数时,括号内传入的值,值可以是常量、变量、表达式或三者的组合:
#1:实参是常量
res=my_min(1,2)
#2:实参是变量
a=1
b=2
res=my_min(a,b)
#3:实参是表达式
res=my_min(10*2,10*my_min(3,4))
#4:实参可以是常量、变量、表达式的任意组合
a=2
my_min(1,a,10*my_min(3,4))
在调用有参数函数时,实参(值)会复制给形参(变量名)。在python中,变量名与值只是单纯的绑定关系,而对于函数来说这种绑定关系旨在函数调用时生效,在调用结束后解除
2. 行参与实参的具体使用
2.1. 位置参数
位置及顺序,位置参数指的是按顺序定义的参数,需要从两个角度去看:
- 在定义函数时,按照从左到右的顺序依次定义形参,称为位置形参,凡是按照这种形式定义的形参都必须被传值
def register(name,age,sex): #定义位置形参:name,age,sex,三者都必须被传值
print('Name:%s Age:%s Sex:%s' %(name,age,sex))
register() #TypeError:缺少3个位置参数
2.2. 关键字参数
在调用函数时,实参可以是key=value的形式,称为关键参数,凡事按照这种形式定义的实参,可以完全不按照从左到右的顺序定义,担任能为指定的形参赋值
def register(name, age, sex):
print('name:%s,age:%s,sex:%s' % (name, age, sex))
res = register(age=18, name='wyz', sex=0) # name:wyz,age:18,sex:0
需要注意在调用函数时,实参也可以是按位置或关键字的混合使用,但必须保证关键字参数在位置参数后面,且不可以对一个形参重复赋值
register('lili',sex='male',age=18) #正确使用
register(name='lili',18,sex='male') #SyntaxError:关键字参数name=‘lili’在位置参数18之前
register('lili',sex='male',age=18,name='jack') #TypeError:形参name被重复赋值
2.3 默认参数
在定义函数时,就已经为形参赋值,这类形参称之为默认参数,当函数由多个参数时**,需要将值经常改变的参数定义成位置参数,而将改变较少的参数定义成默认参数**,例如编写一个注册学生信息的函数,如果大多数学生的性别都为男,那完全可以将形参sex定义成默认参数
def register(name,age,sex='male'): #默认sex的值为male
print('Name:%s Age:%s Sex:%s' %(name,age,sex))
定义时就已经为参数sex赋值,意味着调用时可以不对sex赋值,这降低了函数调用的复杂度
register('tom',17) #大多数情况,无需为sex传值,默认为male
# Name:tom Age:17 Sex:male
register('Lili',18,'female') #少数情况,可以为sex传值female
# Name:Lili Age:18 Sex:female
需要注意:
-
默认参数必须在位置参数之后
-
默认参数的值仅在函数定义阶段被赋值一次
x=1
def foo(arg=x):
print(arg)
x = 5
foo() # 1
- 默认参数的值通常应设为不可变类型
def foo(n,arg=[]):
arg.append(n)
return arg
foo(1)
[1]
foo(2)
[1, 2]
foo(3)
[1, 2, 3]
每次调用时再上一次的基础上向同一列表增加值
def foo(n,arg=None):
if arg is None:
arg=[]
arg.append(n)
return arg
foo(1)
[1]
foo(2)
[2]
foo(3)
[3]
2.4. 可变长度的参数(与*的用法)
参数的长度可变指的是在调用函数时,实参的个数可以不固定,而在调用函数时,实参的定义无非是按位置或按关键字两种形式,这就要求形参提供两种解决方案来分别处理两种形式的可变长度的参数
2.4.1. 可变长度的位置参数
如果在最后一个形参名前加*号,那么在调用函数时,溢出的位置实参,都会被接收,以元组的形式保存下来复制给该形参
def foo(x, y, z=1,*args):
print(x)
print(y)
print(z)
print(args)
foo(1,2,2,5,78,9) # 1 2 2 (5, 78, 9)
如果我们事先生成一个列表,仍然是可以赋值给*args的
def foo(x, y, *acd):
print(x)
print(y)
print(acd)
l = (3,4,5)
# l = [3,4,5]
foo(1, 2,*l) # 1 2 (3,4, 5)
注意:如果在传入L时没有加*,那L就只是一个普通的位置参数了
def foo(x, y, *acd):
print(x)
print(y)
print(acd)
l = (3,4,5)
# l = [3,4,5]
foo(1, 2,l) # 1 2 ((3, 4, 5),)
如果形参为常规的参数(位置或默认),实参仍可以是*的形式
def foo(x,y,z=3):
print(x)
print(y)
print(z)
foo(*[1,2]) # 1 2 3 等同于foo(1,2)
如果我们想要求多个值的和,*args就派上用场了
def add(*args):
res = 0
for i in args:
res += i
# print(res)
return res
print(add(1, 5, 3, 4, 2))
2.4.2 可变长度的关键字参数
如果在最后一个形参名前加* *号,那么在调用函数时,溢出的关键字参数,都会被 * *接收,以字典的形式保存下来赋值给该形参
def foo(x,**kwargs): #在最后一个参数kwargs前加**
print(x)
print(kwargs)
foo(y=2,x=1,z=3) #溢出的关键字实参y=2,z=3都被**接收,以字典的形式保存下来,赋值给kwargs
1
如果我们事先生成了一个字典,仍然是可以传值给**kwargs的
def foo(x,y,**kwargs):
print(x)
print(y)
print(kwargs)
dic={'a':1,'b':2}
foo(1,2,**dic) #**dic就相当于关键字参数a=1,b=2,foo(1,2,**dic)等同foo(1,2,a=1,b=2)
注意:如果在传入dic时没有加**,那dic就只是一个普通的位置参数了
foo(1,2,dic) #TypeError:函数foo只需要2个位置参数,但是传了3个
结束收工环节
声明:上一篇被小妹妹胁迫了 呜呜呜 变成转载了,蛙脸没了啊,兄弟萌
兄弟们,塞不塞,6不6,就是这么简单,就是这么快乐,今天小蛙好细啊。愿诸君能在代码的世界里自由的翱翔。
内容有点多,一定要好好吸收。
喜欢的话,一定要去看本蛙其他作品哦,不喜欢的话,锤你。
本蛙要去拉啦啦,嗝。