Python中的*self,*self._args, **kwargs

我的机器学习教程「美团」算法工程师带你入门机器学习   已经开始更新了,欢迎大家订阅~

任何关于算法、编程、AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI、算法、编程和大数据知识分享,以及免费的SSR节点和学习资料。其他平台(知乎/B站)也是同名「图灵的猫」,不要迷路哦~

 

 

 

 

 

在python中,有些常见方法参数是:*self._args, **kwargs,如:self._target(*self._args, **self._kwargs)。经过查找一些资料,可以归纳为以下两种类型:

  • *self._args 表示接受元组类参数;
  • **kwargs     表示接受字典类参数;

例子:

 

 

 

def foo(*args, **kwargs):
    print 'args = ', args
    print 'kwargs = ', kwargs
    print '---------------------------------------'
if __name__ == '__main__':
    foo(1,2,3,4)
    foo(a=1,b=2,c=3)
    foo(1,2,3,4, a=1,b=2,c=3)
    foo('a', 1, None, a=1, b='2', c=3)

 


输出结果如下:

 

 

args =  (1, 2, 3, 4) 
kwargs =  {} 
--------------------------------------- 
args =  () 
kwargs =  {'a': 1, 'c': 3, 'b': 2} 
--------------------------------------- 
args =  (1, 2, 3, 4) 
kwargs =  {'a': 1, 'c': 3, 'b': 2} 
--------------------------------------- 
args =  ('a', 1, None) 
kwargs =  {'a': 1, 'c': 3, 'b': '2'} 
---------------------------------------

 

可以看到,这两个是python中的可变参数。*args表示任何多个无名参数,它是一个tuple;**kwargs表示关键字参数,它是一个dict。并且同时使用*args和**kwargs时,必须*args参数列要在**kwargs前,像foo(a=1, b='2', c=3, a', 1, None, )这样调用的话,会提示语法错误SyntaxError: non-keyword arg after keyword arg”

 

此外,在Python类定义的方法中,有这样一种写法:

    
class Test_(object):
    def __init__(self, x, y):
        self.__x = x
        self.__y = y

    def __repr__(self):
        class_name = type(self).__name__
        return '{}:({!r}, {!r})'.format(class_name, *self)
        
    def __iter__(self):
        return (i for i in (self.__x, self.__y))
    def test(*self):
        print(self)

    def test2(self):
        print(self)

输出如下:

>>>dd.test()
(Test_:(2, 3),)

>>>dd.test2()
Test_:(2, 3)

>>>dd
Test_:(2, 3)

从上面的例子可以看出,在方法中传入(*self),执行打印操作时,返回值是序列(这里是单元素元组),而传入self参数时,会返回我们期待的repr格式

你可能感兴趣的:(编程之美:Python)