Python 函数参数的五种类型
本章节主要讲解 Python的位置参数,默认参数,可变参数,关键字参数,命名关键字参数 的详细用法。
1. 位置参数
根据定义的函数的参数位置来判断参数的值。位置参数一旦定义,在调用函数时,就必须传入对应的参数值。
def show_info(name, age):
print("name: {0}, age: {1}".format(name,age))
show_info("yuziyue", 23)
2. 默认参数
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("yuziyue", 23)
show_info("yuziyue", 23, "shanghai")
show_info("yuziyue", 23, company="baidu", city="shanghai")
- a、必选参数放在前面,默认参数放在后面
- b、变化大参数放在前面,变化小的放在后面
- c、调用时默认参数可以不用按顺序提供默认参数,可以使用类似
show_info("yuziyue", 23, company="baidu", city="shanghai")
的方法传递参数, 后面的默认参数部分调换了顺序,调用时默认参数部分如果不给出关键字,可以用默认参数按照顺序给出,以位置参数的形式调用,达到位置参数的效果。
show_info("yuziyue", 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")
3. 可变参数
可变参数表示参数的个数变化的,调用时传递多个参数。
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)
4. 关键字参数
关键字参数允许传入未定义的参数名, 函数中 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)
5. 命名关键字参数
命名关键字参数也叫强制关键字参数。关键字参数允许传入任意的参数,命名关键字参数可以限制传入参数的关键字,使用*
将其分开。
- 通常使用方式如下,表示只接收关键字为 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 是传递的可变参数,后面是命名关键字参数。