zoukankan      html  css  js  c++  java
  • Python中的*arg和**kwarg

    一个简单的函数

    首先我们可以定一个简单的函数, 函数内部只考虑required_arg这一个形参(位置参数)

    def exmaple(required_arg):
        print required_arg
    exmaple(
    "Hello, World!")
    >> Hello, World!

    那么,如果我们调用函数式传入了不止一个位置参数会出现什么情况?当然是会报错!

    exmaple("Hello, World!", "another string")
    
    >> TypeError: exmaple() takes exactly 1 argument (2 given)

    定义函数时,使用*arg和**kwarg

    *arg和**kwarg 可以帮助我们处理上面这种情况,允许我们在调用函数的时候传入多个实参

    def exmaple2(required_arg, *arg, **kwarg):
        if arg:
            print "arg: ", arg
    
        if kwarg:
            print "kwarg: ", kwarg
    
    exmaple2("Hi", 1, 2, 3, keyword1 = "bar", keyword2 = "foo")
    
    >> arg:  (1, 2, 3)
    >> kwarg:  {'keyword2': 'foo', 'keyword1': 'bar'}
    

    从上面的例子可以看到,当我传入了更多实参的时候

    • *arg会把多出来的位置参数转化为tuple
    • **kwarg会把关键字参数转化为dict

    再举个例子,一个不设定参数个数的加法函数

    def sum(*arg):
        res = 0
        for e in arg:
            res += e
        return res
    
    print sum(1, 2, 3, 4)
    print sum(1, 1)
    >> 10
    >> 2
    

    当然,如果想控制关键字参数,可以单独使用一个*,作为特殊分隔符号。限于Python 3,下面例子中限定了只能有两个关键字参数,而且参数名为keyword1keyword2

    def person(required_arg, *, keyword1, keyword2):
        print(required_arg, keyword1, keyword2)
    
    person("Hi", keyword1="bar", keyword2="foo")
    >> Hi bar foo
    

    如果不传入参数名keyword1keyword2会报错,因为都会看做位置参数

    person("Hi", "bar", "foo")
    
    >> TypeError: person() takes 1 positional argument but 3 were given
    

    调用函数时使用*arg和**kwarg

    直接上例子,跟上面的情况十分类似。反向思维。

    def sum(a, b, c):
        return a + b + c
    
    a = [1, 2, 3]
    
    # the * unpack list a 
    print sum(*a)
    >> 6
    
    def sum(a, b, c):
        return a + b + c
    
    a = {'a': 1, 'b': 2, 'c': 3}
    
    # the ** unpack dict a
    print sum(**a)
    >> 6


    作者:Jason_Yuan
    链接:http://www.jianshu.com/p/e0d4705e8293
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    Xpath语法与lxml库的用法
    Selenium--使用参考
    PhantomJS的替代品--无头浏览器(Headless Chrome)
    为什么只有一个元素的tuple要加逗号?
    反爬利器--设置代理服务器
    LeetCode 221. 最大正方形 | Python
    LeetCode 572. 另一个树的子树 | Python
    LeetCode 98. 验证二叉搜索树 | Python
    LeetCode 45. 跳跃游戏 II | Python
    LeetCode 25. K 个一组翻转链表 | Python
  • 原文地址:https://www.cnblogs.com/Antiver/p/8042569.html
Copyright © 2011-2022 走看看