python作为一个动态语言其函数的参数也很“动态”。
参数可能有的情况:必选参数、默认参数、可变参数、关键字参数、命名关键字参数
function(a,b=1,*c,**d,*,e)
1.位置参数(正常传参)
就是固定的参数,函数中定义多少个参数,调用函数的时候后就传递多好个参数。
例如:
# 位置参数
def power(x,n):
num=0
while n>1:
num=num+x*x
n=n-1
return num
print(power(2,5))#16
2.默认参数(给定一个默认值)
首先注意:
(1)默认参数要放在最后面,不然会有误会,编译器不知道从哪个数开始算他不是默认参数
(2)默认参数必须指向不变对象
当函数中有部分参数的值在大部分时间是固定的时候,可以预先给它一个值。不用每一次都输入。当然有特殊情况的时候依然可以给它附一个新的值。
例如:power函数大部分时间计算平方根,则此时把n默认赋值为2。
def power(x,n=2):
num=0
while n>1:
num=num+x*x
n=n-1
return num
print(power(2)) #4
如果这个时候print(power(2,5))
依然输出16
3.可变参数(*加参数名,表示此参数可变)
第1种方式:
可变的参数指的是列表(list),数组(tuple).因为其中的数据是可以改变的,将列表和数组作为参数传入函数中,所以函数的参数也是可变的。
例如:power函数
第一种方法:使用 * 放在参数名前,作为可变参数的标志
def calc(*number):
sum = 0
for n in number:
print ('n=',n)
print(sum)
sum = sum + n * n
return sum
number=[2,5]
print('calc',calc(number[0],number[1])) #29
#这里如果要使用列表的话,一定要如此写,不然会有:IndexError: tuple index out of range的报错
第2种方式:将*放在被传递的参数前
def calc(number0,number1):
sum = 0
while number1>1:
sum = sum + number0* number0
number1-= 1
return sum
print(calc(*[2,5])) #16
4.关键字参数(**加参数名,可以传入不同的参数)
函数可以传入不指定个数的参数。
可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
当想要多传参数的时候,需要带上参数名。
也可以先组成一个dict ,当做参数传进去
def information(name,**kwargs):
print('name,dosomething:',name,kwargs)
information('simple1_6',something='write python blog')
#name,dosomething: simple1_6 {'something': 'write python blog'}
5.命名关键字参数(参数+*+参数,后面的参数都是可变参数)
例如:
def information(name,something,*,zhuangtai):
print("name:",name,'do',something,'zhuangtai:',zhuangtai)
information('simple1_6','write python blog',zhuangtai='come')
#name: simple1_6 do write python blog zhuangtai: come
总结:
*args and **kwargs
用*args和**kwargs只是为了方便并没有强制使用它们.
当你不确定你的函数里将要传递多少参数时你可以用*args.例如,它可以传递任意数量的参数:
相似的,**kwargs允许你使用没有事先定义的参数名:
你也可以混着用.命名参数首先获得参数值然后所有的其他参数都传递给*args和**kwargs.命名参数在列表的最前端.
*args和**kwargs可以同时在函数的定义中,但是*args必须在**kwargs前面.