本文主要介绍Python中*args和**kwargs参数的使用

文章目录

1 使用

在Python中,定义函数时可以使用两个特殊符号,以允许它们接受可变数量的参数。这两个特殊符号为*和**。通常*和args一起使用,**和kwargs一起使用。事实上args和kwargs可以用任何名称替代,之所以用args和kwargs仅仅是为了遵从通俗约定。args为arguments的缩写,表示多个参数。kwargs为 keyword arguments 的缩写,表示多个关键字参数。

Python中,(*)会把接收到的参数转为一个元组,而(**)会把接收到的参数转为一个字典。所以*args表示将传入多个参数(包括0个参数)变为元组,**kwargs表示将传入多个带名称的参数(包括0个参数)变为字典。具体例子下面分别介绍。

*args的使用

def func(*args):
# 打印参数类型
print(type(args))
# 打印参数
print(args) func("a", "b", "c")
func(["a", "b", "c"])
# 将一个列表变为元组,需要在传入参数的前面加上一个*
func(*["a", "b", "c"])
<class 'tuple'>
('a', 'b', 'c')
<class 'tuple'>
(['a', 'b', 'c'],)
<class 'tuple'>
('a', 'b', 'c')

**kwargs的使用

def func(**kwargs):
# 转为字典
print(type(kwargs))
for key, value in kwargs.items():
print("{} = {}".format(key,value)) func(param1="a", param2="b", param3="c")
# 也可以直接传入一个字典
dicts={'param1':"a", 'param2':"b", 'param3':"c"}
func(**dicts)
<class 'dict'>
param1 = a
param2 = b
param3 = c
<class 'dict'>
param1 = a
param2 = b
param3 = c

*args和**kwargs共同使用

def fun(*args, **kwargs):
print("args:", args)
print("kwargs:", kwargs)
fun("a", "b", "c", param1="a", param2="b", param3="c")
fun(*["a","b","c"], param1="a", param2="b", param3="c")
args: ('a', 'b', 'c')
kwargs: {'param1': 'a', 'param2': 'b', 'param3': 'c'}
args: ('a', 'b', 'c')
kwargs: {'param1': 'a', 'param2': 'b', 'param3': 'c'}

此外也可以传入其他单独参数名,如下面的例子,传入name和age参数。name参数在第一位,不输入参数名name也会将第一个输入参数视为name。函数中间的参数如age,则需要指定参数名。

def fun(name, *args, age=None, **kwargs):
print("name:", name)
print("args:", args)
print("age:", age)
print("kwargs:", kwargs) fun(1, 2, 3, a=1, b=2, c=3)
fun("helloworld", 1, 2, 3, age=12, a=1, b=2, c=3)
name: 1
args: (2, 3)
age: None
kwargs: {'a': 1, 'b': 2, 'c': 3}
name: helloworld
args: (1, 2, 3)
age: 12
kwargs: {'a': 1, 'b': 2, 'c': 3}

**但是要注意的是,*args必须放在**kwargs前面且**kwarg要位于所有参数最后,因为非默认参数必须在默认参数之前处理,不然会出错。

2 拓展

事实上,在Python3.5以上版本,*和**多了一个功能叫做解包(unpacking)。解包的意思就是将迭代对象里面的元素逐个取出来。迭代的意思就是,当对元组,列表,字典,集合,字符串使用for循环语句的时候,可以依次拿到里面的数据,这样的过程称为遍历,也叫迭代。通过解包就是将元组,列表,字典,集合,字符串每一个单独的值拆分开来。其中*可以用于任何一种Python迭代对象,**只能用于字典。如下面的例子通过*解包对象,输出不再是迭代对象的本身,而是迭代对象的内容。但是这类语言结构最好不要使用,可读性较差。

# 元组解包
my_tuple=(1,2,3)
print(*my_tuple)
1 2 3
# 列表解包
my_list=[1,2,3]
print(*my_list)
1 2 3
# 字典解包
my_dir={"a":1,"b":2}
print(*my_dir)
a b
# 字符串解包
my_string="hello"
print(*my_string)
h e l l o
# 集合解包
my_set=set('hello')
print(*my_set)
e l o h

除此之外,还可以单独解包某个值如下所示

my_list = [1, 2, 3, 4, 5]

a, *b, c = my_list

print(a)
print(b)
print(c)
1
[2, 3, 4]
5

此外解包符还能用于迭代器的合并

# 列表合并
my_list1=[1,2,3]
my_list2=[4,5]
my_list=[*my_list1,*my_list2]
print(my_list)
[1, 2, 3, 4, 5]
# 字典合并
my_dir1={"a":1,"b":2}
my_dir2={"c":3,"d":4,"e":5}
my_dir={**my_dir1, **my_dir2}
print(my_dir)
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

对于字符串,*也能进行一系列的拆分

# 将字符串变为列表
hello = [*"hello"]
print(hello)
['h', 'e', 'l', 'l', 'o']
# 将字符串变为字典
hello = {*"hello"}
print(hello)
{'e', 'l', 'o', 'h'}

3 参考

Python *args and **kwargs

Python中*和**的区别

Python中的args和kwargs

[编程基础] Python中*args和**kwargs参数的使用的更多相关文章

  1. python 中*args 和 **kwargs

    简单的可以理解为python 中给函数传递的可变参数,args 是 列表的形式.kwargs 是 key,value的形式,也就是python 中的字典. *args 必须出现在**kwargs 的前 ...

  2. python 中 *args 和 **kwargs 的区别

    在 python 中,*args 和 **kwargs 都代表 1个 或 多个 参数的意思.*args 传入tuple 类型的无名参数,而 **kwargs 传入的参数是 dict 类型.下文举例说明 ...

  3. Python中*args和**kwargs的区别

    (注:本文部分内容摘自互联网,由于作者水平有限,不足之处,还望留言指正.) 中秋的夜,微凉,但却始终看不见月亮. 我想,它一定是害羞了,悄悄的躲到了乌云的后面. 嗯,就是这样,我真是太TM机智了. 正 ...

  4. Python中 *args 和 **kwargs 的区别

    先来看个例子: def foo(*args, **kwargs): print 'args = ', args print 'kwargs = ', kwargs print '----------- ...

  5. Python中 *args 和 **kwargs 的含义?

    答:在python中,*args和**kwargs通常使用在函数定义里.*args 和 **kwargs 都允许你给函数传不定数量的参数,即使在定义函数的时候不知道调用者会传递几个参数.ps: *ar ...

  6. python 中 *args he **kwargs的区别

    ''' 一 *args 和 **kwargs 的区别? *args 表示任意个 无名参数, 类型是元祖 tuple. **kwargs 表示的是关键字的参数 传入的参数是 dict 类型. 当*和** ...

  7. Python中*args 和**kwargs的用法

    当函数的参数不确定时,可以使用*args 和**kwargs,*args 没有key值,**kwargs有key值.还是直接来代码吧,废话少说[python] def fun_var_args(far ...

  8. Python中*args和**kwargs 的简单使用

    # 在函数定义中使用*args和kwargs传递可变长参数. *args用作传递非命名键值可变长参数列表(位置参数); kwargs用作传递键值可变长参数列表# *args表示任何多个无名参数,它是一 ...

  9. 【Python】Python中*args 和**kwargs的用法

    好久没有学习Python了,应为工作的需要,再次拾起python,唤起记忆. 当函数的参数不确定时,可以使用*args 和**kwargs,*args 没有key值,**kwargs有key值. 还是 ...

随机推荐

  1. 关于maven插件在Myeclipse中的使用

    出现了如下几个错误: 1.访问不到maven的中央仓库,插件下载失败,无法使用插件启动tomcat命令. 解决方法到 maven的配置文件中,一般在我的文档中的.m2文件中的settting.xml中 ...

  2. Js实现一键复制小功能

    function copyToClipboard(textToCopy) { // navigator clipboard 需要https等安全上下文 if (navigator.clipboard ...

  3. Java I/O(1):模型与流

    在1990年以前,有一帮工程师们认为未来(1990年以后)会有很多小型设备需要得到电脑操控(不得不说,想法非常超前),鉴于当时市面上并没有任何一款编程语言能够跨平台,而且能够在诸如烤面包机这种小型设备 ...

  4. 云计算_OpenStack

    部署方式-Fuel 注:部署失败且Fuel方式已过时. 部署方式-packstack 注:基于系统版本CentOS 7.9 2009部署 系统基本设置 设置静态IP=192.168.80.60 设置h ...

  5. 文本转语音TTS(文本阅读和视频配音制作)MP3

    DL-TTS 通过AI驱动引擎可将文本转化为逼真的语音,它可以:(1)生成逼真的合成语音实现与人声的语调和情感匹配的流畅.发音自然的文本转语音.(2)细化的文本转语音控制支持多种语言,并可调整语速.语 ...

  6. MIPI-DSI协议

    MIPI联盟,即移动产业处理器接口(Mobile Industry Processor Interface 简称MIPI)联盟.MIPI(移动产业处理器接口)是MIPI联盟发起的为移动应用处理器制定的 ...

  7. nrf52——DFU升级USB/UART升级方式详解(基于SDK开发例程)

    摘要:在前面的nrf52--DFU升级OTA升级方式详解(基于SDK开发例程)一文中我测试了基于蓝牙的OTA,本文将开始基于UART和USB(USB_CDC_)进行升级测试. 整体升级流程: 整个过程 ...

  8. 如何在.NET程序崩溃时自动创建Dump?

    今天在浏览张队转载文章的留言时,遇到一个读者问了这样的问题,如下图所示: 首先能明确的一点是"程序崩溃退出了是不能用常规的方式dump的",因为整个进程树都已经退出.现场已经无法使 ...

  9. spring源码解析(一) 环境搭建(各种坑的解决办法)

    上次搭建spring源码的环境还是两年前,依稀记得那时候也是一顿折腾,奈何当时没有记录,导致两年后的今天把坑重踩了一遍,还遇到了新的坑,真是欲哭无泪;为了以后类似的事情不再发生,这次写下这篇博文来必坑 ...

  10. git pull与git pull --rebase

    aliases: [] tags: [git] link: date: 2022-08-30 目录 git pull --rebase 等效命令 总结 参考文章 git pull --rebase 在 ...