关键字参数基本使用
关键字参数是指在传递实参的时候, 添加上函数定义时形参的名.
还有一种我们称之为位置参数, 我们前面的参数传递都是位置参数.(按照顺序传递参数.)
关键字参数我们以前其实用过:
在使用print()
函数输出的时候, 我们为了不让后面默认添加换行符, 来自定义结束字符串的时候,就是使用的关键字参数.
print("你好", end="")
print("2你好", end="")
关键字参数的好处:
调用函数传递参数的时候, 不用考虑参数的顺序.
尤其对不需要给带有默认值的参数传递函数的时候尤其有用.
def foo(x=1, y=2, z=3):
return x + y + z
print(foo(y=20))
print(foo(z=30))
关键字参数扩展
关键参数的另一个好处是可以随意扩展参数传递. 正常情况下, 我们传递的关键字参数如果形参已经存在了, 则会传递给指定的形参.
如果关键字参数没有对应的形参, 那么这些关键字参数会传递给形参中的最后一个参数:**kw
(kw
是形参名, 随意). **kw
会把这些没人要的关键字参数作为字典的形式存储起来.
def foo(name, age, **kw):
print(name)
print(age)
print(kw)
foo("李四", age=20, sex="男", country="中国")
注意:
注意把这里的关键字参数和可变参数区别开来. 关键字参数是2个
**
, 而可变参数是1个*
2个
**
的关键字参数必须是形参中的最后一个参数.可变参数和关键字参数可以同时存在.
命名关键字参数
在前面使用关键字参数的时候, 关键字是不受限制的, 我们可以传递任意的关键字参数进去, 没有形参对应的关键字参数会存入到**kw
中.
如果我们想限制关键字参数的名字, 可以使用命名关键字.
在位置参数的后面使用一个*
作为分割, *
好像一个形参, *
后面的参数就是命名关键字, 传递关键字参的时候必须与这里的关键字相对应.
def person(name, *, age, sex="男"): # 这里的 age 和 sex 只能通过关键字参数赋值
print(name, age, sex)
person("李四", age=20, sex="女")
person("李四", age=20)
person("李四", age=20, county="china") # 无法传递 county 这样的关键字参数.
注意:
有了命名关键字参数, 仍然可以使用
**kw
, 则关键字又不会受到限制了.如果前面有了可变参数, 则分隔符
*
可以省略了.
def person(name, *args, age, sex="男"): # 这里的 age 和 sex 只能通过关键字参数赋值
print(name, age, sex, args)
person("李四", age=20, sex="女")
person("李四", age=20)
person("李四", age=20, county="china") # 无法传递 county 这样的关键字参数