Python 语言及其应用 Chapter_4_Note_2 函数_参数_

先前的联系中,函数的参数,尤其是带星号的参数,没怎么复习,这里再复习下

当参数被用在函数内部时, 星号将一组可变数量的位置参数集合成参数值的元组。在下面
的例子中args 是传入到函数print_args() 的参数值的元组

>>> def print_args(*args):
... print('Positional argument tuple:', args)
...
无参数调用函数,则什么也不会返回:
>>> print_args()
Positional argument tuple: ()
给函数传入的所有参数都会以元组的形式返回输出
>>> print_args(3, 2, 1, 'wait!', 'uh...')
Positional argument tuple: (3, 2, 1, 'wait!', 'uh...')
这样的技巧对于编写像print() 一样接受可变数量的参数的函数是非常有用的。如果你的
函数同时有限定的位置参数,那么*args 会收集剩下的参数:
>>> def print_more(required1, required2, *args):
... print('Need this one:', required1)
... print('Need this one too:', required2)
... print('All the rest:', args)
...
>>> print_more('cap', 'gloves', 'scarf', 'monocle', 'mustache wax')
Need this one: cap
Need this one too: gloves
All the rest: ('scarf', 'monocle', 'mustache wax')
当使用* 时不需要调用元组参数args,不过这也是Python 的一个常见做法。



使用**收集关键字参数
使用两个星号可以将参数收集到一个字典中,参数的名字是字典的键,对应参数的值是字

典的值。下面的例子定义了函数print_kwargs(),然后打印输出它的关键字参数:
>>> def print_kwargs(**kwargs):
... print('Keyword arguments:', kwargs)
...
现在,使用一些关键字参数调用函数:
>>> print_kwargs(wine='merlot', entree='mutton', dessert='macaroon')
Keyword arguments: {'dessert': 'macaroon', 'wine': 'merlot', 'entree': 'mutton'}
在函数内部,kwargs 是一个字典。
如果你把带有*args 和**kwargs 的位置参数混合起来,它们会按照顺序解析。和args 一
样,调用时不需要参数kwargs,这也是常见用法。



随后一个重要概念,这本书里没讲,就是还有一个叫做 命名关键字

就是要限制你输入的关键字名字,怎么用呢?


def person(name, age, *, city, job):
    print(name, age, city, job)

和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数

调用方式如下:

>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer

如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了

def person(name, age, *args, city, job):
    print(name, age, args, city, job)

命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错

>>> person('Jack', 24, 'Beijing', 'Engineer')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: person() takes 2 positional arguments but 4 were given

由于调用时缺少参数名city和job,Python解释器把这4个参数均视为位置参数,但person()函数仅接受2个位置参数。

命名关键字参数可以有缺省值,从而简化调用:

def person(name, age, *, city='Beijing', job):
    print(name, age, city, job)

由于命名关键字参数city具有默认值,调用时,可不传入city参数:

>>> person('Jack', 24, job='Engineer')
Jack 24 Beijing Engineer

使用命名关键字参数时,要特别注意,如果没有可变参数,就必须加一个*作为特殊分隔符。如果缺少*,Python解释器将无法识别位置参数和命名关键字参数:

def person(name, age, city, job):
    # 缺少 *,city和job被视为位置参数
    pass


下面看一下自己对以上做的测试,还有就是关于命名关键字参数,如果在调用函数时,没有给予分隔符*后面对应的名字,那么就会报错。













  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值