刚开始接触 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. python写的压缩软件

    import tkinterimport tkinter.filedialogimport osimport zipfileimport tkinter.messagebox #创建住窗口root = ...

  2. idea 过段时间java程序包不存在问题 ?

    有时候我们在导入程序之后,系统会给出错误提示:Java:程序包xxxx不存在,现在我这里有一招,就是使用IDEA自动导入Java程序包,这也是IDEA的一大优点. 但是在看到这个问题的文章的时候,并不 ...

  3. Spring实战拆书--SpringBean

    代码源码地址:https://github.com/wujiachengSH/springBeanDemo 概述:本章将讲解Spring对于Bean的管理方案. 目录: 准备工作 自动装配 处理装配歧 ...

  4. odoo开发笔记 -- many2one搜索更多增加默认过滤条件

    没加过滤条件的时候,效果如下,点击下拉框,搜索更多出现所有模型下的模板: 改进方法(增加默认过滤条件,显示指定模型下的内容): class IrCloudReport(models.Model): _ ...

  5. ionic hidden scroll bar

    ionic 项目中隐藏所有的ion-content滚动条 在variables.scss文件中添加以下代码 ::-webkit-scrollbar { display: none; }  

  6. [Jenkins]Console Output中文显示问号的问题解决

    ------------------------------------------------------ 如需转载,请注明出处. 文章链接:https://www.cnblogs.com/dzbl ...

  7. DotNetCore深入了解之二HttpContext类

    当KestrelServer启动时,会绑定相应的IP地址,同时在绑定时将加入HttpConnectionMiddleware作为终端连接的中间件. public async Task StartAsy ...

  8. centOS改编码

    http://jingyan.baidu.com/article/ab69b270de8b4f2ca7189f1d.html cd /rootvim .bashrcLANG="zh_CN.G ...

  9. vue-13-swiper组件的使用

    vue-13-swiper 是一个滑动库, 非常丰富的滑动样式, 轮播图等 https://www.swiper.com.cn https://github.com/surmon-china/vue- ...

  10. 记一次安装Ipython的流程

    这是一个悲伤的安装ipython的过程. 写下来留个教训吧. 也是希望对博友一些帮助吧. 注: 我也写了一篇window下安装bpython的文章(个人感觉bpython要比ipython强大的多), ...