刚开始接触 python 的时候,对 python 中的 *wargs (可变参数) 和 **kwargs (关键字参数)的理解不是很透彻,看了一下 《Explore Python》一书,里面对这一部分的描述相对浅显易懂, 这里依据个人理解进行相关总结。

可变参数(*args)

对于可变参数可以联想到 C# 中的可变参数。可变参数是一个数量不确定的列表集合,可以是 list 类型,也可以是 tuple 类型

我们定义如下代码段:

def add(*numbers):
print(type(numbers))
sum = 0
for i in numbers:
sum += i
return sum a1 = (1, 2, 3, 4,)
print(add(*a1)) a2 = [1, 2, 3, 4]
print(add(*a2))

通过运行上述代码,我们可以看出,无论我们是需要传递一个 list 集合还是 tuple 集合,在可变参数对应的函数内部都会作为 tuple 类型来处理。此外,我们还需要注意的是,我们需要传递的是集合的指针,而不是该集合对象,这是因为在 python 中,默认通过引用(也就是指针)进行函数的参数传递,这样做避免创建多个拷贝,并且能够按照方便地更新这些对象。


由于在含可变参数的函数内部,可变参数是作为 tuple 类型来处理的, 因此我们无法对其进行修改。我们可以通过创建一个 list 类型的集合临时变量,然后通过这个临时变量实现对传入的可变参数进行修改。

关键字参数(**kwargs)

关键字参数是一个由键值对组成的集合,允许通过变量名进行匹配,而不是位置。

我们定义如下代码段:

def add(**kwargs):
print(type(kwargs))
for key in kwargs:
kwargs[key] += 1
print('{0}:{1}'.format(key,kwargs[key]))
dic = {'x': 1, 'y': 2,'z': 3}
add(**dic)

运行上述代码,我们可以看出,kwargs 的类型为 dict ,因此我们需要用过 key-value 的方式来进行访问。当我们访问的 key 不在该参数列表中程序会发生响应。

综合运用

def test_args_kwargs(arg1, *args, **kwargs):
print(arg1) for val in args:
print(val) for k, v in kwargs.items():
print("{0}:{1}".format(k, v)) test_args_kwargs(1, [1, 2, 3], {"a": 1, "b": 2})

总结

*args 和 **kwargs 并不是 python 中的参数关键字,而是一种惯用写法。


在 python 中,函数参数主要分为:必选参数,默认参数,可变参数,关键字参数。必选参数必须赋值;默认参数可赋可不赋,如不赋值则传递默认的数值;可变参数传递的是一个参数列表,列表中的元素数量不确定;关键字参数是一个键值对集合,通过键值对的方式来进行数值传递。它们之间的排列顺序为:必选参数 -> 默认参数 -> 可变参数 -> 关键字参数。

Python3 系列之 可变参数和关键字参数的更多相关文章

  1. Python 必选参数,默认参数,可变参数,关键字参数和命名关键字参数

    Py的参数还真是多,用起来还是很方便的,这么多参数种类可见它在工程上的实用性还是非常广泛的. 挺有意思的,本文主要参照Liaoxuefeng的Python教程. #必选参数 def quadratic ...

  2. 详解Python函数参数定义及传参(必备参数、关键字参数、默认可省略参数、可变不定长参数、*args、**kwargs)

    详解Python函数参数定义及传参(必备参数.关键字参数.默认可省略参数.可变不定长参数.*args.**kwargs) Python函数参数传参的种类   Python中函数参数定义及调用函数时传参 ...

  3. python函数的参数-可变参数,关键字参数

    # -*- coding: utf-8 -*- #coding=utf-8 ''' @author: tomcat @license: (C) Copyright 2017-2019, Persona ...

  4. Python中的*可变参数与**关键字参数

    1.定义了一个需要两个参数的函数 def print_str(first, second): print first print second if __name__ == "__main_ ...

  5. Python-可变参数和关键字参数(*args **kw)

    前言: Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数. 可变参数和关键字参数的语法: *args是可变参数,args接收的是一个tuple: **kw是关键 ...

  6. 洗礼灵魂,修炼python(21)--自定义函数(2)—函数文档,doctest模块,形参,实参,默认参数,关键字参数,收集参数,位置参数

    函数文档 1.什么是函数文档: 就是放在函数体之前的一段说明,其本身是一段字符串,一个完整的函数需要带有函数文档,这样利于他人阅读,方便理解此函数的作用,能做什么运算 2.怎么查看函数文档: func ...

  7. python函数传入参数(默认参数、可变长度参数、关键字参数)

    1.python中默认缺省参数----定义默认参数要牢记一点:默认参数必须指向不变对象! 1 def foo(a,b=1): 2 print a,b 3 4 foo(2) #2 1 5 foo(3,1 ...

  8. python函数中的参数(关键字参数,默认参数,位置参数,不定长参数)

    默认参数:定义函数的时候给定变量一个默认值. def num(age=1): 位置参数:调用函数的时候根据定义函数时的形参位置和实参位置进行引用. 关键字参数:如果定义的函数中含有关键字参数,调用函数 ...

  9. python的位置参数、默认参数、关键字参数、可变参数区别

    一.位置参数 调用函数时根据函数定义的参数位置来传递参数. #!/usr/bin/env python # coding=utf-8 def print_hello(name, sex): sex_d ...

随机推荐

  1. 816. Ambiguous Coordinates

    We had some 2-dimensional coordinates, like "(1, 3)" or "(2, 0.5)".  Then, we re ...

  2. Eclipse 中 Maven 项目 pom.xml 提示错误 org.codehaus.plexus.archiver.jar.Manifest.write(java.io.PrintWriter)

    从SVN上下载到Eclipse工作空间的项目一直报如下错误,进行一下Maven ---> Update Project... 就不报错了,但是过一会又会报错 查找资料初步确定是Eclipse中自 ...

  3. js控制全屏及退出全屏

    js控制全屏及退出全屏,网上很多代码例子,我这里需求和标准的有点出入: 1.当用户点击某按钮,触发iframe下的页面全屏. 2.不允许用户退出全屏. 解决第一点,触发全屏可以按照网上的例子,代码如下 ...

  4. django- Vue.js 操作

    安装cnpm npm install -g cnpm --registry=https://registry.npm.taobao.org 安装 vue.js cnpm install -g vue- ...

  5. 学习笔记第六课 VB程序

    VB程序的特殊地方在于: 前几课学的破解方法,诸如设置API断点,修改关键CALL的返回值,MESSAGEBOX断点等,这些对于VB程序都是无效的. 这节课是设置VB的API断点,绕过报错弹窗来破解. ...

  6. .NET图平台下的图像处理工具---强大的Emgucv

    图像一直与时代相伴,图形化的应用软件也重不可缺.对于MFC.Delphi.Lazarus.Qt大家可能已经耳熟能详.对于很多图像处理的开源库,很多都是用C\C++写的,而.Net下的开源库以前很少了解 ...

  7. 总结jenkins Android自动打包遇到的坑

    一.ndk-build报错 [root@hejianlai-jenkins LearnGradle]# ndk-build /usr/local/android-ndk-r8/ndk-build: / ...

  8. Centos7静默安装Weblogic12C

      1.前言 WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发.集成.部署和管理大型分布式W ...

  9. Work Queues

    Round-robin dispatching 默认情况下,RabbitMQ按顺序分发消息给下一个消费者.平均每个消费者会得到相同数量的消息. Message acknowledgment 为了确保消 ...

  10. Linux编程 22 shell编程(输出和输入重定向,管道,数学运算命令,退出脚本状态码)

    1. 输出重定向 最基本的重定向是将命令的输出发送到一个文件中.在bash shell中用大于号(>) ,格式如下:command > inputfile.例如:将date命令的输出内容, ...