Python中*args和**kwargs的区别

注:《python核心编程第2版》的11.6可变长度的参数—章节中有详细介绍。
python中我们经常见到,有些函数的参数中有*args和kwargs,那这两个参数是什么意思呢?
没错,*args和
kwargs就是python中的可变参数

可能很多人用了几年的 Python 都没真正使用过可变参数,就比如我,为了学写通用模块,就会对它有需求;或许你经常看 Python 模块库代码,会发现很多函数的参数定义,都会跟上 *args 和 **kwargs(不定参数的另一种形式,后面会讲到)。

在计算机程序设计,一个可变参数函数是指一个函数拥有不定引数,即是它接受一个可变量目的参数。 - 来自 wikipedia

通俗的将,就是函数可以处理不同数量的参数。

一、*args的使用方

  *args 用来将参数打包成tuple给函数体调用

例子:
定义一个函数,传一个不定参数*args,输出结果以元祖的方式显示
在这里插入图片描述
在比如

def argsFunc(a, *args):
	print a
	print args
	
>>> argsFunc(1, 2, 3, 4)
1
(2, 3, 4)

argsFunc 中匹配完定义好的参数,剩余的参数以元组的形式存储在 args(args 名称你可以自行定义),因此在上述程序中只要你传入不小于 1 个参数,该函数都会接受,当然你也可以直接定义只接受可变参数,你就可以自由传递你的参数:

def argsFunc(*my_args):
	print my_args
	
>>> argsFunc(1, 2, 3, 4)
(1, 2, 3, 4)
>>> argsFunc()
()

二、**kwargs的使用方法

形参名前加两个*表示,参数在函数内部将被存放在以形式名为标识符的 dictionary 中,这时调用函数的方法则需要采用 arg1=value1,arg2=value2 这样的形式。

为了区分,我把 *args 称作为数组参数,**kwargs 称作为字典参数

>>> def a(**x):print x
>>> a(x=1,y=2,z=3)
{'y': 2, 'x': 1, 'z': 3} #存放在字典中

注意一,采用 **kwargs 传递参数的时候,你不能传递数组参数

>>> a(1,2,3) #这种调用则报错
Traceback (most recent call last):
  		File "<stdin>", line 1, in <module>
TypeError: a() takes exactly 0 arguments (3 given)

注意二: 参数arg、*args、**kwargs三个参数的位置必须是一定的。必须是(arg,*args,**kwargs)这个顺序,否则程序会报错。

同样很简单,但是我们什么时候可以用到他呢?

import mysql.connector  

db_conf = {
	user='xx',
	password='yy', 
	host='xxx.xxx.xxx.xxx',
	database='zz'
}

cnx = mysql.connector.connect(
	user=db_conf['user'],
	password=db_conf['password'], 
	host=db_conf['host'],
	database=db_conf['database']
	)

...

相比,使用 Mysql Python 库时候,经常看到这个样子的代码,db_conf 一般都从配置文件读取,这是优雅的不定字典参数就派上用途了!

import mysql.connector  

db_conf = {
	user='xx',
	password='yy', 
	host='xxx.xxx.xxx.xxx',
	database='zz'
}

cnx = mysql.connector.connect(**db_conf)

...
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值