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

导读

最近看了看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. 切碎

原文发布于微信公众号 - 深度学习自然语言处理(zenRRan)

原文发表时间:2018-10-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏猿人谷

浅谈C/C++中的指针和数组(一)

                                                       浅谈C/C++中的指针和数组(一)       指...

2175
来自专栏阿凯的Excel

Python读书笔记25(类的继承)

谈类的使用,怎能缺失类的继承!类的继承可以大大简化代码编辑工作。 为啥这么说呢! 因为一个类继承另外一个类的时候,可以自动获得另一个类的所有属性和方法! 原有的...

3486
来自专栏Java帮帮-微信公众号-技术文章全总结

Java面试系列6

清明即事 帝里重清明, 人心自愁思。 车声上路合, 柳色东城翠。 花落草齐生, 莺飞蝶双戏。 空堂坐相忆, 酌茗聊代醉。 1.String是最基本的数据类型吗...

2715
来自专栏张善友的专栏

检查Python对象

编程环境中的对象很象现实世界中的对象。实际的对象有一定的形状、大小、重量和其它特征。实际的对象还能够对其环境进行响应、与其它对象交互或执行任务。计算机中的对象试...

19610
来自专栏阿凯的Excel

Python读书笔记(变量)

前言:本系列为小编的读书笔记,非教学课程;小编只是想用平实的语言翻译一下自己所学的东西。 首先什么是变量呢? 百度百科:变量来源于数学,是计算机语言中能储存计算...

36910
来自专栏Python专栏

如何通过一些骚操作有效的控制Python类

1614
来自专栏苦逼的码农

谈谈fail-fast与fail-safe

fail-fast的字面意思是“快速失败”。当我们在遍历集合元素的时候,经常会使用迭代器,但在迭代器遍历元素的过程中,如果集合的结构被改变的话,就会抛出异常,防...

1244
来自专栏F_Alex

在Java中谈尾递归--尾递归和垃圾回收的比较(转载)

2325
来自专栏码洞

跋山涉水 —— 深入 Redis 字典遍历

Redis 字典的遍历过程逻辑比较复杂,互联网上对这一块的分析讲解非常少。我也花了不少时间对源码的细节进行了整理,将我个人对字典遍历逻辑的理解呈现给各位读者。也...

1271
来自专栏Golang语言社区

Golang语言--细节汇总

slice和数组在声明时的区别:声明数组时,方括号内写明了数组的长度或使用...自动 计算长度,而声明slice时,方括号内没有任何字符。 对于slice有几个...

3699

扫码关注云+社区

领取腾讯云代金券