• 详解python中的*与**用法


    前言

    经常看开源python代码,对于*和**的用法理解不透彻,决定弄懂。

    涵义

    可变参数

    常见于python主函数的一种写法

    def foo(*args, **kwargs):
        pass
    

    有点类似于C++的通配参数
    *args用于捕获所有的顺序参数,返回tuple
    **kwargs用于捕获所有的关键字参数,返回dict
    举例说明

    >>> def foo(*args,**kwargs):
    ...     print("args=",args)
    ...     print("kwargs=",kwargs)
    ... 
    >>> foo(1)
    args= (1,)
    kwargs= {}
    >>> foo(1,2,3)
    args= (1, 2, 3)
    kwargs= {}
    >>> foo(1,2,x=3)
    args= (1, 2)
    kwargs= {'x': 3}
    >>> foo(1,2,3,c=4,5)
      File "<stdin>", line 1
    SyntaxError: positional argument follows keyword argument
    

    为避免歧义python规定关键字参数只能放在最后

    字典提取

    对于dict对象,*和**可以用来提取内容

    >>> d={'x':1,'y':2,'z':3}
    >>> print(*d)
    x y z
    

    等效于print('x','y','z')

    >>> d={'x':1,'y':2,'z':3}
    >>> def bar(x,y,z):
    ...     return x+y+z
    ... 
    >>> bar(**d)
    6
    

    等效于bar(x=1,y=2,z=3)

    >>> d={'x':1,'y':2,'z':3}
    >>> def plus(x,y):
    ...     return x+y
    ... 
    >>> plus(**d)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: plus() got an unexpected keyword argument 'z'
    

    注意dict不能包含无关参数,否则会报错

  • 相关阅读:
    退役了
    Luogu1835 素数密度_NOI导刊2011提高(04
    Luogu1941 飞扬的小鸟
    Luogu4711 「化学」相对分子质量
    CF285E Positions in Permutations
    JZOJ 5944
    BZOJ3827: [Poi2014]Around the world && CF526E Transmitting Levels
    BZOJ3831: [Poi2014]Little Bird
    CF526F Pudding Monsters
    运算符重载
  • 原文地址:https://www.cnblogs.com/azureology/p/15194112.html
Copyright © 2020-2023  润新知