Python参数类型
位置参数
调用函数时根据函数定义的参数位置来传递参数
def print_hello(name, sex):
sex_dict = {1: u'先生', 2: u'女士'}
print 'hello %s %s, welcome to python world!' %(name, sex_dict.get(sex, u'先生'))
# 两个参数的顺序必须一一对应,且少一个参数都不可以
print_hello('tanggu', 1)
关键字参数
用于函数调用,通过“键-值”形式加以指定,可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求
有位置参数时,位置参数必须在关键字参数前面,但关键字参数之间不存在先后顺序
# 以下是用关键字参数正确调用函数的实例
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):
....
# 错误的定义方式
def print_hello(sex=1, name):
....
# 调用时不传sex的值,则使用默认值1
print_hello('tanggu')
# 调用时传入sex的值,并指定为2
print_hello('tanggu', 2)
可变参数
定义函数时,不确定调用时会传递几个参数(也可不传参),此时使用包裹(packing)位置函数或包裹关键字参数
-
包裹位置传递
def func(*args): .... func() func(a) func(a, b, c)
所有传进的参数都会被args变量收集,会根据传进参数的位置合并为一个元组(tuple),args是元组类型
-
包裹关键字传递
def func(**kargs): .... func(a=1) func(a=1, b=2, c=3)
解包裹参数
*和**,也可以在函数调用时使用,称为解包裹(unpacking)
传递元组时,让元组的每一个元素对应一个位置参数(list也可以传递)
def print_hello(name, sex):
print name, sex
args = ('tanggu', '男')
print_hello(*args)
# tanggu 男
在传递词典字典时,让词典的每个键值对作为一个关键字参数传递给函数
def print_hello(kargs):
print kargs
kargs = {'name': 'tanggu', 'sex', u'男'}
print_hello(**kargs)
# {'name': 'tanggu', 'sex', u'男'}
几种参数混合使用时,基本原则是:
先位置参数,默认参数,包裹位置,包裹关键字(定义和调用都应遵循)
def func(name, age, sex=1, *args, **kargs):
print name, age, sex, args, kargs
func('tanggu', 25, 2, 'music', 'sport', class=2)
# tanggu 25 1 ('music', 'sport') {'class'=2}
args和kwargs这个可以自己定义,关键在于*和**
*args表示任意多个无名参数,是一个tuple
**kwargs表示任意多个关键字参数,是一个dict
同时使用时,必须要使*args在**kwargs之前
*args的本质就是将标准调用剩下的值集中转变为元组
用**kwargs创建字典
def kw_dict(**kwargs):
return kwargs
print kw_dict(a=1,b=2,c=3) == {'a':1, 'b':2, 'c':3}
混合使用
def foo(x,*args,a=4,**kwargs): #使用默认参数时,注意默认参数的位置要在args之后kwargs之前
print(x)
print(a)
print(args)
print(kwargs)
foo(1,5,6,7,8,y=2,z=3) #调用函数,不修改默认参数
1 #x的值
4 #a的值
(5, 6, 7, 8) #*args的值
{'y': 2, 'z': 3} ##kwargs的值
def foo(x,a=4,*args,**kwargs): ##注意:当需要修改默认参数时,要调整默认参数的位置,要放在args之前即可,但不可放在开头。
print(x)
print(a)
print(args)
print(kwargs)
foo(1,9,5,6,7,8,y=2,z=3) #调用函数,修改默认参数a为9
1 #x的值
9 #被修改后a的值
(5, 6, 7, 8) #args的值
{'y': 2, 'z': 3} #kwargs的值