欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python函数参数传递列表(python输入任意多个数求和)

程序员文章站 2024-03-27 09:14:46
参数定义(形参):1. 位置参数def foo(a, b,):2. 可变长位置参数def foo(a, b, *args):3. 命名关键字参数def foo(a, b, *, c):def foo(...

参数定义(形参):

1. 位置参数

  • def foo(a, b,):

2. 可变长位置参数

  • def foo(a, b, *args):

3. 命名关键字参数

  • def foo(a, b, *, c):
  • def foo(a, b, *args, c): (如果已经有*args, 可以不用*分隔, c也已经是”命名关键字参数”了)

使用*号分隔, 后面的形参名c表示: 之后的实参传递进来的时候, 必须要使用”c”这个关键字传参

如: foo(1, 2, *[3, 4, 5], c=6) >> 可正常调用

foo(1, 2, *[3, 4, 5], b=6) >> 报错

用途: 不明(感觉没啥用啊)

4. 默认/非默认参数

  • def foo(a, b, *args, c=618, d):
  • def foo(a, b=618, *args, c, d):

位置: 必须要放在”非默认的位置参数”后 (notice: ‘默认参数b’ 可以放在 “非默认的命名关键词参数c和d” 前 )

5. 可变长关键字参数

  • def foo(a, b, *args, c, d, **kwargs):

其实**kwargs参数也算是一种”命名关键字参数” (它也是必须要以”关键字传参”形式传入实参)

参数传递(实参):

1. 位置传参

  • foo(1, 2, [3, 4, 5], *[6, 7, 8]) >>等价于>> foo(1, 2, [3,4,5], 6, 7, 8)

2. 关键字传参

  • foo(a=1, b=2, c={“c”:3, “d”:4}, d=**{“e”:5, “f”:6}) >>>> foo(a=1, b=2, c={“c”:3, “d”:4}, e=5, f=6)

注意:

传递参数时:

  • *: 是对list解包 即:以”位置传参”的形式传递参数
  • **: 是对dict解包 即:以”关键字传参”的形式传递参数

接收参数时(在函数内部使用参数时):

  • *: 是对list打包 即:把多个传进来的”位置参数”, 收集到一个元祖, 并将这个元祖赋值给args这个变量
  • **: 是对dict打包 即:把多个传进来的”关键字参数”, 收集到一个字典, 并将这个字典赋值给kwargs这个变量

所以此时:

args: 其实就是个元祖tuple

kwargs: 其实就是个字典dict

def foo(a, b=99, *args, c=618, d, **kwargs):
    print(a) # [0, 1, 2]
    print(b) # 3
    print(args) # (4, 5)
    print(*args) # 4, 5
    print(c) # 6
    print(d) # 7
    print(kwargs) # {"x":88, "y":99}
    # print(**kargs) # 这样的解包形式会出错!!
    print(kwargs["y"]) # 99

foo([0, 1, 2], *[3, 4, 5], c=6, d=7, x=88, y=99)

"""
上述案例中:
    1. [0, 1, 2] 就是1个类型为list的位置参数
    2. *[3, 4, 5] 就等价于  3, 4, 5  的位置传参(传进3个位置参数)
    3. 当b为"非默认参数"时, a一定不能是"默认参数"
"""