【python】参数中的*args和**kwargs
转自https://www.cnblogs.com/xuyuanyuan123/p/6674645.html#undefined
多个实参,放到一个元组里面,以*开头,可以传多个参数;**是形参中按照关键字传值把多余的传值以字典的方式呈现
*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.如果你曾经想知道它们是干什么的,或者想知道你的IDE为什么在main()函数中定义它们,那么本文可以帮助到你 ...
- [转]Python tips: 什么是*args和**kwargs?
Python tips: 什么是*args和**kwargs? 原文地址:http://www.cnblogs.com/fengmk2/archive/2008/04/21/1163766.html ...
- 【转载】Python tips: 什么是*args和**kwargs?
转自Python tips: 什么是*args和**kwargs? 先来看个例子: def foo(*args, **kwargs): print 'args = ', args print 'kwa ...
- python中,*args和**kwargs这两个参数的作用是什么?
*args和**kwargs这两个都是不定长参数,可以解决函数中参数不固定的问题,*args可以把位置参数转化成元组,**kwagrs可以把关键字参数转化成字段
- 理解 Python 中的 *args 和 **kwargs
Python是支持可变参数的,最简单的方法莫过于使用默认参数,例如: def test_defargs(one, two = 2): print 'Required argument: ', one ...
- 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 ...
- Python中的 *args 和 **kwargs
基本概念 Python支持可变参数,最简单的方法莫过于使用默认参数. def test_defargs(one, two=2): # 参数one没有默认值,two的默认值为2 print('Requi ...
- Python中的*args和**kwargs的理解与用法
一.简述 1.*args和**kwargs 这两个是python中方法的可变参数. 2.*args表示任何多个无名参数,它是一个tuple: 3.**kwargs表示关键字参数,它是一个dict.并且 ...
- python 可变参数函数定义* args和**kwargs的用法
python函数可变参数 (Variable Argument) 的方法:使用*args和**kwargs语法.其中,*args是可变的positional arguments列表,**kwargs是 ...
随机推荐
- Docker Image管理学习笔记,ZT
Docker Image管理学习笔记 http://blog.csdn.net/junjun16818/article/details/38423391
- 7.8 GRASP原则八: 间接 Indirection
GRASP原则八: 间接 Indirection 若两个对象直接连接,导致耦合太紧,如何解决?3.1 GRASP rule8: Indirection 间接 Name: Indirection ...
- leetcode-algorithms 目录
leetcode算法目录 题号 链接 难度等级 36 leetcode-algorithms-36 Valid Sudoku medium 35 leetcode-algorithms-35 Sear ...
- ProtoBuf3.3 安装记录
翻了很多教程,下载了 PB 的源码在自己的 mac 上编译及安装,记录下新的 1. 首先是下载源码了 https://github.com/google/protobuf/releases 虽然是 g ...
- call、apply、bind,你有多了解?
call.apply.bind 1.相同也不同 我们先从浅显的部分开始讲, 这三个方法都可以改变this的指向,都可以进行传参,第一个参数都是修改this的指向 call() 和 apply() 改变 ...
- day41-python多进程多线程-多线程共享
线程共享变量多线程和多进程不同之处在于多线程本身就是可以和父进程共享内存的,这也是为什么其中一个线程挂掉以后,为什么其他线程也会死掉的道理. import threading def worker() ...
- Centos7安装xenserver tools
mount /dev/cdrom /mnt [root@192 ~]# mount /dev/cdrom /mntmount: /dev/sr0 写保护,将以只读方式挂载[root@192 ~]# c ...
- 2017年4月7日16:18:17 java8 常用记录
List<String> customerUids = customerTagModel.stream().map(CustomerTagModel::getCustomerUid) ...
- idea设置代码块
转:https://blog.csdn.net/boy_Kenny/article/details/55223078?utm_source=blogxgwz4 idea设置代码块 1.代码模板场景介绍 ...
- 剑指Offer 51. 构建乘积数组 (数组)
题目描述 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1].不 ...