社区所有版块导航
Python
python开源   pycharm   Django   Python   DjangoApp  
DATA
docker   Elasticsearch  
WEB开发
linux   bottle   tornado   IE   NoSql   MQ   Bootstrap   MongoDB   js   Redis   其他Web框架   Jquery   peewee   DATABASE   web工具   Git   NGINX   zookeeper  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
运营
印度
印度  
Python社区  »  Python

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

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

阅读大概需要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
 
139 次点击  
分享到微博