技术背景

通常我们在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. Python爬虫系统化学习(3)

    一般来说当我们爬取网页的整个源代码后,是需要对网页进行解析的. 正常的解析方法有三种 ①:正则匹配解析 ②:BeatuifulSoup解析 ③:lxml解析 正则匹配解析: 在之前的学习中,我们学习过 ...

  2. Linux就该这样学--之常用linux命令及bash基础

    Linux就该这样学--之常用linux命令及bash基础 Linux命令 管道 重定向 环境变量 常用命令 常用系统工作命令 系统状态检测命令 工作目录切换命令 文本文件编辑命令 文件目录管理命令 ...

  3. SpringBoot(四): SpringBoot web开发 SpringBoot使用jsp

    1.在SpringBoot中使用jsp,需要在pom.xml文件中添加依赖 <!--引入Spring Boot内嵌的Tomcat对JSP的解析包--> <dependency> ...

  4. java 流程控制学习

    https://www.kuangstudy.com/course 用户交互Scanner import java.util.Scanner; public class Demo01 { public ...

  5. IntelliJ-IDEA 打包代码报错

    一.问题由来 使用 IntelliJ-IDEA 打包项目一直以来都没问题,可是上周的时候,突然打包就报错了,并且Maven中的pom.xml文件确定是没有改过,打包的配置文件也没有修改过. 报错信息如 ...

  6. jwt以及如何使用jwt实现登录

    目录 jwt的使用和使用jwt进行登录 什么是jwt jwt的组成 为什么选择jwt session的缺点 jwt的优点 一个jwt的工具类 将jwt和登录进行结合 axios方式将jwt放在head ...

  7. 微服务架构Day16-SpringBoot之监控管理

    监控管理使用步骤 通过引入spring-boot-starter-actuator,可以使用SpringBoot提供应用监控和管理的功能.可以通过HTTP,JMX,SSH协议来进行操作,自动得到审计, ...

  8. 学习Python的书籍——入门到进阶

    入门读物 <Python基础教程>(Beginning Python From Novice to Professional) <Python学习手册>(Learning Py ...

  9. International Collegiate Programming Contest 2019 Latin American Regional Contests Problem K

    题目链接:https://codeforces.ml/gym/102428/attachments/download/9820/statements-en.pdf 题意:构造一个多项式使得外星人编号的 ...

  10. Fishing Master HDU - 6709

    题目链接:https://vjudge.net/problem/HDU-6709 题意:给出n条鱼的抓捕时间k和煮鱼时间a[i],你要在最短时间把所有鱼都煮了.(注意你只有一口锅) 思路:首先我们必须 ...