*args和**kwargs
- *args的使用方法
*args 用来将参数打包成tuple给函数体调用
def n(*args):
print(args,type(args))
n() # () <class 'tuple'>
n('lps')# ('lps',) <class 'tuple'>
n(12212)# (12212,) <class 'tuple'>
---------------------------------
def m(x,y,*args):
print(x,y,args,type(args))
m('a','b','fwf')# a b ('fwf',) <class 'tuple'>
m(132,131,231,'tfe')#132 131 (231, 'tfe') <class 'tuple'>
- **kwargs的使用方法
**kwargs 打包关键字参数成dict给函数体调用
def w(**kwargs):
print(kwargs,type(kwargs))
w(b=1,c=2,r='h')#{'b': 1, 'c': 2, 'r': 'h'} <class 'dict'>
**注意点:参数arg、*args、**kwargs三个参数的位置必须是一定的。必须是(arg,*args,kwargs)这个顺序,否则程序会报错。
def w(arg,*args,**kwargs):
print(arg,args,kwargs)
w(1,'sfsf',a=1)
*和**的区别
(*)会把接收到的参数形成一个元组,而(**)则会把接收到的参数存入一个字典
- *接收任意长度的参数,并把它们存入一个元组中
def foo(*args):
print(args)
add=[1,2,3]
foo(add)#([1, 2, 3],)
foo(*add)#(1, 2, 3) 如果我们希望将一个数组形成元组,
# 需要在传入参数的前面 加上一个*
- **将接收到的参数存入一个字典
def foo(**kwargs):
for key,value in kwargs.items():
print('%s=%s'%(key,value))
foo(a=1,b=2,c=3)
# 輸出
# a=1
# b=2
# c=3
- (*)和(**)一起使用
def foo(*args,**kwargs):
print('args',args)
print('kwargs',kwargs)
add=[1,2,3]
foo(*add,a=1,b=2)
# 输出
# args (1, 2, 3)
# kwargs {'a': 1, 'b': 2}
位置参数
调用函数时根据函数定义的参数位置来传递参数
def num(name,sex):
sex1={1:'先生',2:'女士'}
print('hello %s %s,welcome to python world'%(name,sex1.get(sex)))
num('sfsdf',2)
#两个参数的顺序必须一一对应,且少一个参数都不可以
关键字参数
用于函数调用,通过“键-值”形式加以指定。可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求
print_hello('tanggu',sex=1)
print_hello(1,name='tanggu')
print_hello(name='tanggu',sex=1)
print_hello(sex=1,name='tanggu')
#錯誤示範
print_hello(name='tanggu', 1)
print_hello(sex=1, 'tanggu')
有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序的
默认参数
用于定义函数,为参数提供默认值,调用函数时可传可不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)
#正确的默认参数定义方式--> 位置参数在前,默认参数在后
def print_hello(name, sex=1):
print_hello('tanggu')
print_hello(2)
print_hello('tanggu',2)
可变参数
定义函数时,有时候我们不确定调用的时候会传递多少个参数(不传参也可以)。此时,可用包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递,会显得非常方便
转载