python函数形参中的*args和**kwargs
转载:https://www.cnblogs.com/xuyuanyuan123/p/6674645.html
多个实参,放到一个元组里面,以*开头,可以传多个参数;**是形参中按照关键字传值把多余的传值以字典的方式呈现
*args:(表示的就是将实参中按照位置传值,多出来的值都给args,且以元祖的方式呈现)
示例:
1
2
3
4
5
|
def foo(x, * args): print (x) print (args) foo( 1 , 2 , 3 , 4 , 5 ) #其中的2,3,4,5都给了args |
执行结果是:
1
2
|
1 ( 2 , 3 , 4 , 5 ) |
当args与位置参数和默认参数混用的情况下:(注意三者的顺序)
示例一、(三者顺序是:位置参数、默认参数、*args)
1
2
3
4
5
6
|
def foo(x,y = 1 , * args): print (x) print (y) print (args) foo( 1 , 2 , 3 , 4 , 5 ) #其中的x为1,y=1的值被2重置了,3,4,5都给了args |
执行结果是:
1
2
3
|
1 2 ( 3 , 4 , 5 ) |
示例二、(三者顺序是:位置参数、*args、默认参数)
1
2
3
4
5
6
|
def foo(x, * args,y = 1 ): print (x) print (args) print (y) foo( 1 , 2 , 3 , 4 , 5 ) #其中的x为1,2,3,4,5都给了args,y按照默认参数依旧为1 |
执行结果是:
1
2
3
|
1 ( 2 , 3 , 4 , 5 ) 1 |
其中关于*,可以从2个角度来看(需要拆分来看):
1、从形参的角度来看:
示例:
1
2
3
|
def foo( * args): #其实这一操作相当于def foo(a,b,c,d,e): print (args) foo( 1 , 2 , 3 , 4 , 5 ) #其中的1,2,3,4,5都按照位置传值分别传给了a,b,c,d,e |
执行结果是:
1
|
( 1 , 2 , 3 , 4 , 5 ) |
2、从实参的角度来看:
示例:
1
2
3
4
5
6
|
def foo(x,y,z): print (x) print (y) print (z) foo( * ( 1 , 2 , 3 )) #其中的*(1,2,3)拆开来看就是:foo(1,2,3),都按照位置传值分别传给了x,y,z |
执行结果是:
1
2
3
|
1 2 3 |
——————————————————————————————————————————————————————————————————————————————————————
**kwargs:(表示的就是形参中按照关键字传值把多余的传值以字典的方式呈现)
示例:
1
2
3
4
|
def foo(x, * * kwargs): print (x) print (kwargs) foo( 1 ,y = 1 ,a = 2 ,b = 3 ,c = 4 ) #将y=1,a=2,b=3,c=4以字典的方式给了kwargs |
执行结果是:
1
2
|
1 { 'y' : 1 , 'a' : 2 , 'b' : 3 , 'c' : 4 } |
关于**kwargs与位置参数、*args、默认参数混着用的问题:(注意顺序)
位置参数、*args、**kwargs三者的顺序必须是位置参数、*args、**kwargs,不然就会报错:
示例:
1
2
3
4
5
|
def foo(x, * args, * * kwargs): print (x) print (args) print (kwargs) foo( 1 , 2 , 3 , 4 ,y = 1 ,a = 2 ,b = 3 ,c = 4 ) #将1传给了x,将2,3,4以元组方式传给了args,y=1,a=2,b=3,c=4以字典的方式给了kwargs |
执行结果是:
1
2
3
|
1 ( 2 , 3 , 4 ) { 'y' : 1 , 'a' : 2 , 'b' : 3 , 'c' : 4 } |
错误示例:(由于顺序错误)
1
2
3
4
5
|
def foo(x, * * kwargs, * args): print (x) print (args) print (kwargs) foo( 1 ,y = 1 ,a = 2 ,b = 3 ,c = 4 , 2 , 3 , 4 ) |
执行结果就会报错:
1
|
SyntaxError: invalid syntax |
位置参数、默认参数、**kwargs三者的顺序必须是位置参数、默认参数、**kwargs,不然就会报错:
示例:
1
2
3
4
5
|
def foo(x,y = 1 , * * kwargs): print (x) print (y) print (kwargs) foo( 1 ,a = 2 ,b = 3 ,c = 4 ) #将1按照位置传值给x,y按照默认参数为1,a=2,b=3,c=4以字典的方式给了kwargs |
执行结果是:
1
2
3
|
1 1 { 'a' : 2 , 'b' : 3 , 'c' : 4 } |
其中关于**,可以从2个角度来看(需要拆分来看):
1、从形参的角度来看:
示例:
1
2
3
|
def foo( * * kwargs): #其实就是相当于def foo(y,a,b,c) print (kwargs) foo(y = 1 ,a = 2 ,b = 3 ,c = 4 ) |
执行结果是:
1
|
{ 'y' : 1 , 'a' : 2 , 'b' : 3 , 'c' : 4 } |
2、从实参的角度来看:
示例一:
1
2
3
4
5
6
|
def foo(a,b,c,d): print (a) print (b) print (c) print (d) foo( * * { "a" : 2 , "b" : 3 , "c" : 4 , "d" : 5 }) #**{"a":2,"b":3,"c":4,"d":5}是将字典里的每个值按照关键字传值的方式传给a,b,c,d |
执行结果是:
1
2
3
4
|
2 3 4 5 |
示例二:
1
2
3
4
5
6
|
def foo(a,b,c,d = 1 ): print (a) print (b) print (c) print (d) foo( * * { "a" : 2 , "b" : 3 , "c" : 4 }) #**{"a":2,"b":3,"c":4}是将字典里的每个值按照关键字传值的方式传给a,b,c;d依旧按照默认参数 |
执行结果是:
1
2
3
4
|
2 3 4 1 |
python函数形参中的*args和**kwargs的更多相关文章
- python函数——形参中的:*args和**kwargs
python函数——形参中的:*args和**kwargs 多个实参,放到一个元组里面,以*开头,可以传多个参数:**是形参中按照关键字传值把多余的传值以字典的方式呈现 *args:(表示的就是将 ...
- 【python】参数中的*args和**kwargs
转自https://www.cnblogs.com/xuyuanyuan123/p/6674645.html#undefined 多个实参,放到一个元组里面,以*开头,可以传多个参数:**是形参中按照 ...
- Python中的args和kwargs
有时,你会看到python中定义函数的时候带有两个奇怪的参数:*args.**kwargs.如果你曾经想知道它们是干什么的,或者想知道你的IDE为什么在main()函数中定义它们,那么本文可以帮助到你 ...
- python函数—形参、实参、位置参数、关键字参数
1.通过def function_name([parameter]): 定义,函数一遇到return即结束运行.如果函数没有定义返回值,则返回None,如果定义了一个返回值,则返回该对象,如果一个re ...
- Python - 函数形参之必填参数、缺省参数、可变参数、关键字参数的详细使用
Python函数形参 必传参数:平时最常用的,必传确定数量的参数 缺省参数:在调用函数时可以传也可以不传,如果不传将使用默认值 可变参数:可变长度参数 关键字参数:长度可变,但是需要以kv对形式传参 ...
- 跟着太白老师学python 10day 函数的动态参数 *args, **kwargs, 形参的位置顺序
1. *args 接收实参的位置参数, **kwargs接收实参的关键字参数 def func(*args, **kwargs): print(args, kwargs) func(1, 2, 3, ...
- python:函数中的*args与**kwargs
首先定义一个包含*args和**kwargs的函数,这个函数唯一的功能就是输出自己的两个参数,以此来理解*args和**kwargs def myFunc(*args, **kwargs): prin ...
- python中的*args与**kwargs的含义与作用
在定义函数的时候参数通常会使用 *args与**kwgs,形参与实参的区别不再赘述,我们来解释一下这两个的作用. *args是非关键字参数,用于元组,**kwargs是关键字参数 (字典)例如下面的代 ...
- 理解 Python 中的 *args 和 **kwargs
Python是支持可变参数的,最简单的方法莫过于使用默认参数,例如: def test_defargs(one, two = 2): print 'Required argument: ', one ...
随机推荐
- (寒假集训) Piggyback(最短路)
Piggyback 时间限制: 1 Sec 内存限制: 64 MB提交: 3 解决: 3[提交][状态][讨论版] 题目描述 Bessie and her sister Elsie graze i ...
- PowerDisginer中NAME与COMMENT转换脚本
Option Explicit ValidationMode = True InteractiveMode = im_Batch Dim mdl ' the current model ' get t ...
- Mobius反演与积性函数前缀和演学习笔记 BZOJ 4176 Lucas的数论 SDOI 2015 约数个数和
下文中所有讨论都在数论函数范围内开展. 数论函数指的是定义域为正整数域, 且值域为复数域的函数. 数论意义下的和式处理技巧 因子 \[ \sum_{d | n} a_d = \sum_{d | n} ...
- Word中更新交叉引用
方法一:选择要更新的域,按F9键即可. 方法二:右键单击要更新的域,在弹出的右键菜单中选择“更新域”即可. 方法三:若域位于一个含有“更新”按钮的特定容器中,则点击“更新”即可.
- 彻底理解Java中的hashcode方法(转)
本文转自http://www.importnew.com/18851.html 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有 ...
- 在CcentOS系统上将deb包转换为rpm包
deb文件格式本是ubuntu/debian系统下的安装文件,那么我想要在redhat/centos/fedora中安装,需要把deb格式的软件包转化成rpm格式. 需要用到的转换工具:alien_8 ...
- Shell--Bash shell的操作环境
一.路径与命令查找顺序 1.以相对/绝对路径执行命令,例如“/bin/ls”或“./ls”; 2.由alias找到该命令来执行 3.由bash内置的(builtin)命令来执行 4.通过$PATH这个 ...
- Myeclipse 编译等级
1.Java compiler level does not match the version of the installed Java project facet. 问题描述:编译等级不匹配 解 ...
- 权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现3
权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现3 之前两篇相关博文: 权重轮询调度算法(WeightedRound-RobinScheduling)-Ja ...
- .Net程序测试使用阿里云OCS开放缓存服务
首先需要有一个阿里的OCS实例和ECS云服务器 请确认这两个是在同一个可用区的,这个很重要! 这两个可以在阿里云官网申请得到 拿到OCS之后 进入OCS控制台,点击下面的客户端下载选择.Net客 ...