python的* 和**;位置参数、默认参数、关键字参数、可变参数

def foo(name, *args, age=None, **kargs):
    print('name', name)
    print('args', args)
    print('age', age)
    print('kargs', kargs)

(1)第一个参数后面的任意个参数会被* args捕获,存入一个元组。如foo(‘p’,‘hello’, ‘world’),则args=(‘hello,‘world’)
(2)函数签名中未命名的关键字参数会被**kargs捕获,存入一个字典。如foo(‘p’, ‘hello’, id =33),则args=‘hello’, kargs = {id: 33}

定义函数时:

  • 位置参数:调用函数时根据函数定义的参数位置来传递参数
  • 默认参数:如age=None为参数提供默认值None,调用函数时可传可不传该默认参数的值
    (注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)
    在这里插入图片描述
  • 可变参数
    【1】 包裹(packing)位置传递(* ):按照签名中的位置,传进的任意个参数都会被args变量收集,它会根据传进参数的位置合并为一个元组(tuple),args是元组类型
    【2】包裹关键字传递( ** ):kargs是一个字典(dict),收集所有函数签名中未命名的关键字参数

在这里插入图片描述

调用函数时:

  • 关键字参数
    有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序的
  • 解包裹参数:* 和 **,也可以在函数调用的时候使用,称之为解包裹(unpacking)

在这里插入图片描述

位置参数、默认参数、可变参数的混合使用

  • 基本原则:一般参数,包裹位置参数,默认参数,包裹关键字(定义和调用都应遵循)。因为一般参数和包裹参数其实都是位置参数,根据位置判定对应实参中的哪一个;而默认参数和包裹关键字都是关键字参数,就算不按顺序也可以按照关键字给出
    在这里插入图片描述

参考:
python的位置参数、默认参数、关键字参数、可变参数区别
Python中*和**的区别

猜你喜欢

转载自blog.csdn.net/aLWX_hust/article/details/86608009
今日推荐