Py学习  »  Python

谈一谈python中的魔法变量*args和**kwargs

深度学习自然语言处理 • 5 年前 • 375 次点击  

阅读大概需要4分钟

跟随小博主,每天进步一丢丢


导读

最近看了看github大佬写的代码后,发现自己之前写的代码就是个,没有注释,没有封装,没有可读性。哎,幸亏发现及时,现在正在写一个新的任务,刚好可以好好弄弄架构和代码了!


在弄代码期间发现了*args和**kwargs这两个参数大佬们有时候经常用,当然最多的其实是在阅读python自己的源代码的时候最长见了,今天我终于了解清楚它们到底是啥了,大家一起来看!


小小声明

先弄个声明哈,*args和**kwargs这种写法不是必须的,只有前面的 * 才是必须的。当然你也可以写成*var和**vars,而写成*args和**kwargs是一个约定俗成的一个命名规范而已。


*args的用法

*args和**kwargs主要用于函数定义。功能是将不确定数量的参数传递给一个函数。


这里说说*args,它是用来发送一个非键值对的可变数量的参数列表给一个函数。


吃个栗子:





    

def test_var_args(f_arg, *args):
  print("first normal arg:", f_arg)
  for arg in args:
      print("another arg through *args:", arg)

test_var_args('zero', 'one', 'two', 'three')

输出结果为:


first normal arg: one
another arg through *args: one
another arg through *args: two
another arg through *args: three


懂了吧,咱们进行下一个**kwargs!


**kwargs的用法

上面的*args说的是非键值对,所以这里肯定就是键值对啦。如果你想要一个函数里传入带名字的参数,就可以用**kwargs。


 吃个栗子:


def test_var_kwargs(**kwargs):
   for key, value in kwargs.items():
       print("{0} == {1}".format(key, value))


>>> test_var_kwargs(arg0="zero",arg1="one")
arg0 == zero
arg1 == one


简单吧。接下来我们谈谈如何使用*args和**kwargs来调用一个参数为列表或字典的函数!


使用*args和**kwargs来调用函数


假设你要实现这样的一个函数:


def test_args_kwargs(arg1, arg2, arg3):
   print("arg1:", arg1)
   print("arg2:", arg2)
   print("arg3:", arg3)


你可以这样使用*args和**kwargs:


# 首先使用 *args
>>> args = ("two", 3, 5)
>>> test_args_kwargs(*args)
arg1: two
arg2: 3
arg3: 5

#
现在使用 **kwargs:
>>> kwargs = {"arg3": 3, "arg2": "two", "arg1": 5}
>>> test_args_kwargs(**kwargs)
arg1: 5
arg2: two
arg3: 3


*args和**kwargs的使用顺序


如果你想要使用所有的参数情况的话,他们的顺序是这样的:


some_func(fargs, *args, **kwargs)


*args是可变的positional arguments列表,**kwargs是可变的keyword arguments列表。并且,*args必须位于**kwargs之前,因为positional arguments必须位于keyword arguments之前。


IELTS a bit


adjacent adj. 邻近的

chop n. 羊排

       v. 切碎



推荐阅读:

一大批历史精彩文章啦

【前沿】详细讲解Transformer新型神经网络在机器翻译中的应用

深度 | 从各种注意力机制窥探深度学习在NLP中的神威




今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/s7BIeWD2Oz
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/25078
 
375 次点击