IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python函数不定长参数之*args与**kwargs -> 正文阅读

[Python知识库]Python函数不定长参数之*args与**kwargs

1. *args与**kwargs

*args:接收不确定长度的位置参数(即实参可能为0个、一个或多个),并将所有接收到的位置参数打包成一个元组,传入args参数

**kwargs:接收不确定长度的关键字参数,并将所有接收到的关键字参数打包成一个字典,传入kwargs参数

【有关于位置参数和关键字参数的区别可以看这里——一文快速理解Python函数中形参、实参、位置参数及关键字参数的概念

2. 使用*args传递不定长位置参数

首先我们来看一个通过使用*args来传递加数的求和函数的实现。

def sum_num(*args):
    print("args:", args)
    print("The type of parameter arg is:", type(args))
    result = 0
    for num in args:
        result += num
    return result


sum_result = sum_num(1, 3, 5, 8)
print("The sum of the input numbers is:", sum_result)
------------------------------------------------------
args: (1, 3, 5, 8)
The type of parameter arg is: <class 'tuple'>
The sum of the input numbers is: 17

此例中,函数通过*args分别接受了4个加数,分别是1、3、5、8并将其打包存在参数args中,参数args的类型是元组,args=(1, 3, 5, 8)。通过一次for循环,我们实现了对args中所有参数的遍历并求和。

需要注意的是*args只接收位置参数,如果想向其传入关键字参数将会出现错误,显示该函数并不期望获得一个关键字参数。

def sum_num(*args):
    print("args:", args)
    print("The type of parameter arg is:", type(args))
    result = 0
    for num in args:
        result += num
    return result


sum_result = sum_num(1, 3, 5, a=8)
print("The sum of the input numbers is:", sum_result)
--------------------------------------------------------------------------
Traceback (most recent call last):
  File "C:/Users/asus1/PycharmProjects/test/test.py", line 10, in <module>
    sum_result = sum_num(1, 3, 5, a=8)
TypeError: sum_num() got an unexpected keyword argument 'a'

那如果想向函数传入不定长的关键字参数的话,我们就可以通过**kwargs来实现。

3. 使用**kwargs传递不定长关键字参数

在此同样以上文的求和函数为例,我们将每个传入的加数都变为关键字参数,首先观察一下参数kwargs。

def sum_num(**kwargs):
    print("kwargs:", kwargs)
    print("The type of parameter kwarg is:", type(kwargs))
    # result = 0
    # for num in kwargs:
    #     result += num
    # return result


sum_num(a=1, b=3, c=5, d=8)
-----------------------------------------------------------
kwargs: {'a': 1, 'b': 3, 'c': 5, 'd': 8}
The type of parameter kwarg is: <class 'dict'>

可以从控制台输出看到,当函数通过**kwargs接收关键字参数时,会将其打包成一个字典形式存入kwargs中,因此如果仍想实现对传入参数的求和,应当遍历字典中的所有值并实现加和,修改后的代码如下所示。

def sum_num(**kwargs):
    print("kwargs:", kwargs)
    print("The type of parameter kwarg is:", type(kwargs))
    result = 0
    for num in kwargs.values():
        result += num
    return result


sum_result = sum_num(a=1, b=3, c=5, d=8)
print("The sum of the input numbers is:", sum_result)
------------------------------------------------------------
kwargs: {'a': 1, 'b': 3, 'c': 5, 'd': 8}
The type of parameter kwarg is: <class 'dict'>
The sum of the input numbers is: 17

P.S.此处想要传递不定长位置参数或关键字参数不是必须以args和kwargs作为参数名,但是我们约定俗成地将这两个参数名作为传递不定长位置参数和关键字参数的名字。

为了方便大家理解,最后我们通过改变参数名实现一个简单的小应用o(∩_∩)o~

4. 打印著名艺人吴意饭(化名)的简要个人信息

def kris_info(*nicknames, **info):
    print("吴意饭昵称")
    print("、".join(nicknames))
    print("\n吴意饭个人信息")
    for key, value in info.items():
        print("{}:{}" .format(key, value))


kris_info('加拿大电鳗', '吴签', '牙签', 名字='吴意饭', 名言='我的很大,你忍一下~',
          作品='《有一个地方只有我们知道》《从此以后》《大碗牢饭》')
-------------------------------------------------------------------------------
吴意饭昵称
加拿大电鳗、吴签、牙签

吴意饭个人信息
名字:吴意饭
名言:我的很大,你忍一下~
作品:《有一个地方只有我们知道》《从此以后》《大碗牢饭》

可以看到,这里我们分别通过*nickname和**info来传递吴意饭的昵称和个人信息而非原先的*args和**kwargs。

需要注意的是:在传参时位置参数必须在关键字参数之前,否则就会像下面这样子报错,显示关键字参数在位置参数之后为语法错误。

def kris_info(*nicknames, **info):
    print("吴意饭昵称")
    print("、".join(nicknames))
    print("\n吴意饭个人信息")
    for key, value in info.items():
        print("{}:{}" .format(key, value))


kris_info(名字="吴意饭", 名言='我的很大,你忍一下~', 作品='《有一个地方只有我们知道》《从此以后》《大碗牢饭》',
          "加拿大电鳗", "吴签", "牙签")
----------------------------------------------------------------------------------------------------------
  File "C:/Users/asus1/PycharmProjects/test/test.py", line 10
    "加拿大电鳗", "吴签", "牙签")
    ^
SyntaxError: positional argument follows keyword argument
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-10 23:06:26  更:2021-08-10 23:06:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 10:00:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码