一、位置参数
根据定义的函数的参数位置来判断参数的值。位置参数一旦定义,在调用函数时,就必须传入对应的参数值。
def show_info(name, age):
print("name: {0}, age: {1}".format(name,age))
show_info("yuchaoshui", 23)
二、默认参数
def show_info(name, age, city="beijing", company="alibaba"):
print("name: {0}, age: {1}, city:{2}, company:{3}".format(name, age, city, company))
show_info("yuchaoshui", 23)
show_info("yuchaoshui", 23, "shanghai")
show_info("yuchaoshui", 23, company="baidu", city="shanghai")
注意:
- a、必选参数放在前面,默认参数放在后面
- b、变化大参数放在前面,变化小的放在后面
- c、调用时默认参数可以不用按顺序提供默认参数,可以使用类似
show_info("yuchaoshui", 23, company="baidu", city="shanghai")
的方法传递参数, 后面的默认参数部分调换了顺序 - 调用时默认参数部分如果不给出关键字,可以用默认参数按照顺序给出,以位置参数的形式调用,达到位置参数的效果。
show_info("yuchaoshui", 23, shanghai, baidu)
- d、默认参数必须指定不变对象,不能是
[]
这种可变的序列。
def func(a, b=[])
pass
上面的做法是错误的,正确的应该像下面这样实现。
no_value = object()
def func(a, b=no_value):
if b is no_value:
print("No b value supplied")
三、可变参数
可变参数表示参数的个数变化的,调用时传递多个参数。
def func(*args):
for i in args:
print(i)
func(1,2,3,4)
也可以先组装 list 或 tuple,再通过 *mylist
传入,调用函数时, *
可以将序列分解成单个的参数。args接收到的是一个 tuple 或 list
def func(*args):
for i in args:
print(i)
mylist = [1,2,3,4]
func(*mylist)
四、关键字参数
关键字参数允许传入未定义的参数名, 函数中 kwargs
接收到的是一个字典。
调用函数方式时使用类似 city='Shanghai'
这种方式传入参数。 也可以传入一个字典,传入时使用两个 **
号来将字典解析成参数传入。
def person(**kwargs):
for k,v in kwargs.items():
print('{0}: {1}'.format(k, v))
person(city='Shanghai')
extra = {'city': 'Beijing', 'job': 'Engineer'}
person(**extra)
五、命名关键字参数
命名关键字参数也叫强制关键字参数。关键字参数允许传入任意的参数,命名关键字参数可以限制传入参数的关键字,使用*
将其分开。
- 通常使用方式如下,表示只接收关键字为city、job的参数传入值。如果传入其他未定义的关键字参数则报错。
def person(name, age, *, city, job):
print(name, age, city, job)
person('yzy', 23, city='beijing', job='programer')
- 命名关键字参数一旦定义,调用时就必须要传入,除非给定的关键字参数已经有了默认值
def person(name, age, *, city='beijing', job='programer'):
print(name, age, city, job)
person('yzy', 23)
- 如果已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符
*
了:
def person(name, age, *scores, city='beijing', job='programer'):
print(name, age, scores, city, job)
person('yzy', 23, 99, 100, city='shanghai')
结果为: yzy 23 (99, 100) shanghai programer
, 99,100 是传递的可变参数,后面是命名关键字参数。
六、函数参数组合使用
以上5中参数都可以随意组合,但是参数定义的顺序必须是:位置参数、默认参数、可变参数、命名关键字参数和关键字参数。
注意: 参数的组合使用不建议太复杂,太复杂的话可读性很差。
七、函数参数类型检查
函数的参数可以使用 isinstance()
内置函数来检查。
def test(x,y,z):
if not isinstance(x, int):
raise TypeError('x need arg type int')
if not isinstance(y, str):
raise TypeError('y need arg type str')
if not isinstance(z, (str, int)):
raise TypeError('z need arg type str or int')
test(2,'3',object)