技术背景

通常我们在python中定义一个函数的时候,需要给出明确的函数输入参量,比如对于一个数学函数\(z=f(x,y)\)就表示,\(z\)是关于\(x\)和\(y\)的一个函数。但是如果对于未知参量的函数,比如函数形式可以是\(z=f(x,y)\),但也可以是\(z=f(x,y,m,n,i,j,k)\),在不确定入参的时候,就可以采用python中的*args和**kwargs参数。

*args参数的使用方法

首先用一个例子来说明一下*args的基本用法,这个参量可以替代函数括号中的固定变量,从数据结构上说是一个可变长度的tuple:

# test_args.py

def fargs(*args):
s = 0
for variable in args:
s += float(variable)
return s if __name__ == '__main__':
import sys
args_string = ''
for number in sys.argv[1:]: # 从命令行获取任意长度的参数
args_string += number
args_string += ','
s = eval('fargs({})'.format(args_string)) # 直接用字符串执行函数
print ('The sum of {} is: {}'.format(args_string, s))

在这个案例中,我们不仅介绍了*args的使用方法,也利用了命令行参数获取和eval函数这两个python中常见的使用技巧。其中关于获取命令行参数的使用技巧,可以参考这一篇博客。上述代码的执行效果如下所示:

[dechin@dechin-manjaro args]$ python3 test_args.py 1 2 3 3.14
The sum of 1,2,3,3.14, is: 9.14
[dechin@dechin-manjaro args]$ python3 test_args.py 1 2 3 3.14 0.86
The sum of 1,2,3,3.14,0.86, is: 10.0

这里给了两个不同长度的输入,通过函数fargs完成了求和的工作,并且输入的长度是可变的。

**kwargs的用法

**kwargs的用法是类似于上面介绍的*args的,区别在于**kwargs本质上是传入了一个“字典”,或者称之为一个键值对。需要注意的是,这里每一个键值对的数据格式都是tuple类型的,而不是python中的字典类型,所以上面说到“字典”时加了引号。参考示例如下:

# test_kwargs.py

def fkwargs(**kwargs):
s = 0
print ('Key values input: ',kwargs)
for key, variable in kwargs.items():
s += float(variable)
return s if __name__ == '__main__':
import sys
args_string = ''
for number in sys.argv[1:]:
args_string += number
args_string += ','
s = eval('fkwargs({})'.format(args_string))
print ('The sum of {} is: {}'.format(args_string, s))

这里的场景我们设置为一个买菜购物计算总价格的函数,输入的参数是每一个购买的物品及其价格,最后的输出是购买总价格,测试结果如下所示:

[dechin@dechin-manjaro args]$ python3 test_kwargs.py egg=20 beaf=60 milk=10
Key values input: {'egg': 20, 'beaf': 60, 'milk': 10}
The sum of egg=20,beaf=60,milk=10, is: 90.0
[dechin@dechin-manjaro args]$ python3 test_kwargs.py egg=20 water=1
Key values input: {'egg': 20, 'water': 1}
The sum of egg=20,water=1, is: 21.0

总结概要

为了使得输入参数的可扩展性更好,python中自带了args和kwargs两种方法,可以用于表示一个tuple类型的可变长度入参。其中args是一系列的一元变量的输入,kwargs是一系列键值对的输入,可以认为是一个二元变量的输入。虽然这两种方案也都可以用自行实现的tuple来替代,但是直接使用这两种定义会节省很多自定义可变入参的繁琐。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/args.html

作者ID:DechinPhy

更多原著文章请参考:https://www.cnblogs.com/dechinphy/

python3函数可变输入参量的更多相关文章

  1. python3函数

    一.python3函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.可以自己创建函数,这被叫做用户自定义函数. 1.定义函数规则 函 ...

  2. python015 Python3 函数

    Python3 函数函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可 ...

  3. Python3函数中特殊形参的使用:*、*args、**kwargs

    Python3函数中特殊形参的使用:*.*args.**kwargs ==用法1:不定长参数== 当函数需要的参数数量不确定的时候,可以使用*args 和 **kwargs , 所有的位置参数保存在* ...

  4. 07 . Python3函数

    Python3函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.Python提供了许多内建函数,比如print().我们可以直接调用 ...

  5. 汉诺塔python3函数编写和过程分析

    !/usr/bin/env python3 -- coding: utf-8 -- 利用递归函数计算阶乘 N! = 1 * 2 * 3 * ... * N def fact(n): if n == 1 ...

  6. Python3 函数注解

    Python3提供一种语法,用于为函数声明中的参数和返回值附加元数据.下面的例子是注解后的版本,特点在第一行: 1 def clip(text : str, max_len : 'int > 0 ...

  7. 5 Python3 函数进阶&迭代器与生成器

    1.函数进阶 1.1.名称空间 又名name space, 顾名思义就是存放名字的地方,存什么名字呢?举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的 ...

  8. Python3 函数作用域

    一 LEGB 什么是LEGB? L:local 函数内部作用域 E:enclosing 函数内部与内嵌函数之间 G:global 全局作用域 B:build-in 内置作用域 顺序是什么? 跟名字一样 ...

  9. python系列十:python3函数

    #!/usr/bin/python #-*-coding:gbk-*- '''函数的简单规则:    函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ().    任何传入参数和自变量必 ...

随机推荐

  1. idea更改包名无法加载主类解决

    把工程下面的.idea目录下的workspace.xml里面的路径改成你最新的路径即可. <option name="SPRING_BOOT_MAIN_CLASS" valu ...

  2. 重复代码的克星,高效工具 VSCode snippets 的使用指南

    为什么要用 snippets(代码段)? 不管你使用何种编程语言,在我们日常的编码工作中,都会存在有大量的重复代码编写,例如: 日志打印: console.log,log.info('...') 输出 ...

  3. Mybatis检查SQL注入

    Mybatis 的 Mapper.xml 语句中 parameterType 向SQL语句传参有两种方式:#{ } 和 ${ }. 使用#{ }是来防止SQL注入,使用${ }是用来动态拼接参数. 如 ...

  4. docker的安装和基本的docker命令、镜像和容器的操作

    1.yum 包更新到最新 yum update 2.安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 yum insta ...

  5. 微信小程序弹出层

    1.消息提示     wx.showToast wx.showToast({ title: '成功', icon: 'success', duration: 2000 })2.模态弹窗 wx.show ...

  6. 1.1 Python3基础-前言

    >>返回主目录 Python 交互式代码 Python 脚本式代码 第一段Python代码: print('Hello World!') >>返回主目录

  7. Hi3559AV100 NNIE开发(2)-RFCN(.wk)LoadModel及NNIE Init函数运行过程分析

    之后随笔将更多笔墨着重于NNIE开发系列,下文是关于Hi3559AV100 NNIE开发(2)-RFCN(.wk)LoadModel及NNIE Init函数运行过程分析,通过对LoadModel函数及 ...

  8. [ONTAK2010] Peaks 加强版

    [ONTAK2010] Peaks 加强版 题目大意:原题变为强制在线查询 Solution 读入山高,排序后依然建立树链,初始化并查集,初始化重构树新节点标号为\(n+1\) 读入边,按照边权从小到 ...

  9. FZU_1608 Huge Mission 【线段树区间更新】

    一.题目 Huge Mission 二.分析 区间更新,用线段树的懒标记即可.需要注意的时,由于是在最后才查询的,没有必要每次更新都对$sum$进行求和.还有一点就是初始化的问题,一定记得线段树上每个 ...

  10. 在用free()函数释放指针内存时为何要将其指针置空

    在通过free()函数释放指针内存之后讲其指针置空,这样可以避免后面的程序对与该指针非法性的判断所造成的程序崩溃问题.释放空间,指针的值并没有改变,无法直接通过指针自身来进行判断空间是否已经被释放,将 ...