在阅读Python代码时,经常会看到如下函数的定义:

def fun(*args, **kwargs):

很多同学可能会对此感到困惑,这个 * args和 **kwargs是什么东西、为啥会在源码中应用的这么管阿帆呢?

这就要从函数的参数说起了,函数在传参时通常分为四种情况:

  1、普通参数:即在调用函数时必须按照准确的顺序来进行传递。

  2、默认参数:即参数含有默认值、在调用函数时可以进行参数传递、若没有进行参数传递则使用默认值,要注意,默认参数必须在普通函数的右侧,(否则解释器无法解析)。

  3、元组参数:即*args,参数格式存储在一个元组中,长度没有限制,必须位与普通函数和默认参数之后。

  4、字典参数:**kwargs,参数格式化存储在一个字典中,必须位与参数列表的最后面

普通参数实例如下,在调用函数的时候必须传入参数,否则会抛出TypeError异常:

def fun(name);
print "Hello:", name fun('Python')

默认参数必须跟在普通参数之后,不能在普通参数之前,默认参数可以穿值,也可以不传,不传值时就采用默认参数;

def fun(base, rate=0.1):
return base + base*rate fun() fun(, 0.2)

元组参数需要跟在普通参数默认参数的后面,其最大的特点就是不限制长度:

def fun(arg1, arg2='Default', *args):
print('arg1:', arg)
print('arg2:', arg2)
for eacharg in args:
print('tuple:', eacharg) fun('Python')
fun('Python', 'Excellent')
fun('Python', 'Excellent', 'I', 'love', '100', 'Years')

最后一次调用的结果为:

arg1: Python

arg2: Excellent

tuple arg: I

tuple arg: Love

tuple arg: Python

tuple arg: 100

tuple arg: Years

由此可见,元组的长度是不可受限制的

字典参数必须跟在其它参数后面,并且长度也是不手限制的;

def fun(arg1, arg2 = 'Default', *args, **kwargs):
print('arg1:', arg1)
print('arg2:', arg2) for eacharg in args:
print('tuple arg:', eacharg) for eachkwarg in kwargs.keys():
print('dict arg', eacharg, ':', kwarg[eachkwarg]) fun('Python', 'Excellent', 'I', 'Love', 'You', language = 'Python', number = , time = 'Years')

运行的输出结果为:

arg1: Python

arg2: Excellent

tuple arg: I

tuple arg: Love

dict arg number : 100

dict arg language : Python

dict arg time : Years

当我们将普通参数和默认参数放到元组或者字典参数中时,函数的定义就变为仅仅剩余元组和字典参数了:

def fun(*args, **kwargs):

    for eacharg in arg:

        print('tuple arg:', eacharg)

    for eachkwarg in kwargs.keys():

        print('dict arg:', eachkwarg, ":", kwargs[eachkwarg])

fun('Python', 'Excellent', 'I', 'Love', '', 'You',language = 'Python', number = , time = 'Years')

这也是很多源码中对函数的定义。运行结果输出为:

tuple arg: Python

tuple arg: Excellent

tuple arg: I

tuple arg: Love

dict arg number : 100

dict arg language : Python

dict arg time : Years

所有的参数均可以正确获取

运行的输出结果为:

arg1: Python

arg2: Excellent

tuple arg: I

tuple arg: Love

dict arg number : 100

dict arg language : Python

dict arg time : Years

python 中的 *args 和 **kwargs的更多相关文章

  1. 理解 Python 中的 *args 和 **kwargs

    Python是支持可变参数的,最简单的方法莫过于使用默认参数,例如: def test_defargs(one, two = 2): print 'Required argument: ', one ...

  2. Python中的*args和**kwargs

    原文地址:http://www.linuxidc.com/Linux/2011-10/45083.htm 先来看个例子: ,2,3,4) foo(a=1,b=2,c=3) foo(1,2,3,4, a ...

  3. Python中的 *args 和 **kwargs

    基本概念 Python支持可变参数,最简单的方法莫过于使用默认参数. def test_defargs(one, two=2): # 参数one没有默认值,two的默认值为2 print('Requi ...

  4. Python中的*args和**kwargs的理解与用法

    一.简述 1.*args和**kwargs 这两个是python中方法的可变参数. 2.*args表示任何多个无名参数,它是一个tuple: 3.**kwargs表示关键字参数,它是一个dict.并且 ...

  5. Python中的args和kwargs

    有时,你会看到python中定义函数的时候带有两个奇怪的参数:*args.**kwargs.如果你曾经想知道它们是干什么的,或者想知道你的IDE为什么在main()函数中定义它们,那么本文可以帮助到你 ...

  6. python中的*args与**kwargs的含义与作用

    在定义函数的时候参数通常会使用 *args与**kwgs,形参与实参的区别不再赘述,我们来解释一下这两个的作用. *args是非关键字参数,用于元组,**kwargs是关键字参数 (字典)例如下面的代 ...

  7. python中应用*args 与**kwargs

    这是Python函数可变参数 args及kwargs------->目的是:当函数的参数不确定时,可以使用*args 和**kwargs,*args 没有key值,**kwargs有key值. ...

  8. python中,*args和**kwargs这两个参数的作用是什么?

    *args和**kwargs这两个都是不定长参数,可以解决函数中参数不固定的问题,*args可以把位置参数转化成元组,**kwagrs可以把关键字参数转化成字段

  9. python中“*”、"*args"、"kwargs"三种用法

    参考链接:https://www.cnblogs.com/cwind/p/8996000.html 注意的是: (1)"*"符号的用法很类似C++中的指针,针对列表; (2)&qu ...

随机推荐

  1. Cookie API介绍

    一.Java提供的操作Cookie的API Java中的javax.servlet.http.Cookie类用于创建一个Cookie Cookie类的主要方法 No. 方法 类型 描述 Cookie( ...

  2. SharePoint 获取服务器场管理员密码

    前言 这还是很久以前发生的故事(你也可以说事故),公司新来的小朋友帮客户运维,然后,因为客户要改场管理员密码,这个很简单啊,我们有密码变更的文档.小朋友分分钟就帮客户把密码更新了,然后,就去干别的了. ...

  3. 「CF1042F」Leaf Sets

    传送门 Luogu 解题思路 比较显然的一种做法: 我们把一个点的子树高度抠出来并排序记为 \(L_i\),找到最大的 \(i\) 使得 \(L_{i-1}+L_i\le K\). 于是我们把前 \( ...

  4. 我的 Python 编码规范

    python 文件的组成 为了便于描述,先上一个 demo #!/usr/bin/env python # -*- coding: utf-8 -*- """通常这里是关 ...

  5. (2)Linux Java环境变量安装

    install default JRE/JDK Installing Java with apt-get is easy. First, update the package index: sudo ...

  6. 服务器(1)——IIS(1)——Windows7中IIS简单安装与配置(详细图解)

    最近工作需要IIS,自己的电脑又是Windows7系统,找了下安装的方法,已经安装成功. 一.首先是安装IIS.打开控制面板,找到“程序与功能”,点进去 二.点击左侧“打开或关闭Windows功能” ...

  7. QRious入门

    qrious是一款基于HTML5 Canvas的纯JS二维码生成插件.通过qrious.js可以快速生成各种二维码,你可以控制二维码的尺寸颜色,还可以将生成的二维码进行Base64编码. qrious ...

  8. Centos7618安装Docker

    本文基于Centos7.6.18进行安装与测试 移除旧的版本: $ sudo yum remove docker \ docker-client \ docker-client-latest \ do ...

  9. Dart语言学习(十五) Dart函数方法

    Dart函数方法可分为两类: 一.内置方法/函数: print(); 二.自定义方法: 自定义方法的基本格式: 返回类型 方法名称(参数1,参数2,...){ 方法体 return 返回值; } vo ...

  10. Python3.5学习之旅——day5

    模块初识 一.定义 在python中,模块是用来实现某一特定功能的代码集合.其本质上就是以‘.py’结尾的python文件.例如某文件名为test.py,则模块名为test. 二.导入方法 我们在这一 ...