python中的fun_Python fun中*args,**kwargs参数的含义和用法(*args,**kwargs),Pythonfunargskwargs,及...
1. Python函数中的两种参数
我们知道,在Python中有两种参数
位置参数(positional argument): 位置参数只能由参数位置决定
关键词参数(keyword argument): 关键词参数只需要用 keyword = somekey 的方法即可传参
位置参数只能由参数位置决定。这也就决定了
位置参数一定要在前面
,否则关键词参数数量的变化都会使得位置无法判断。
2. 理解函数调用中的
*
*
的作用是将tuple或者list中的元素进行unpack,分开传入,作为多个参数。
def func(a,b,c)
print(a,b,c)
alist = [1,2,3] # 这里alist的长度必须和函数中参数的个数相同,否则会报错
func(*alist) # 等同于 func(1, 2, 3)
1 2 3
2.1
*
做了什么
它拆开数列
alist
的数值作为
位置参数
,并把这些位置参数传给函数
func
来调用。
因此拆数列、传位置参数意味着
func(*alist)
与
func(1,2,3)
是等效的,因为
alist= [1,2,3]
。
3. 理解函数调用中的
**
**
的作用是unpack字典,并将字典中的数据项作为键值参数传给函数。
为了更好的理解举几个例子:
def func(a, b, c):
print(a, b, c)
if __name__ == "__main__":
dic = {'b': 2, 'c': 3}
func(1, b=2, c=3)
func(1, **dic)
1 2 3
1 2 3
4. 理解函数调用中的
*args
和
**kwargs
kwargs
是
keyword argument
的缩写,
args
就是
argument
。常见的是
*args
在
**kwargs
前面。
这两个的用途和效果如下:
def this_fun(a,b,*args,**kwargs):
"""
在这个函数定义中,参数”a, b”代表”常规参数列表”。
args 接收元组作为位置参数,而非是常见的参数列表
"""
print(a,b)
print(args)
print(kwargs)
if __name__ = '__main__'
this_fun(0,1,2,3,index1=11,index2=22)
0,1
(2, 3)
{'index2': 22, 'index1': 11}
也就是说,第一中不定的参数形式把剩下的没有关键字的参数收起来形成一个tuple,而第二种把有关键字的收起来做成一个字典。
5. 实例说明
args
,
kwargs
的应用场景
5.1 子类传参给父类方法
在任何时候继承类和重写方法的,我们应当用到
args
,
kwargs
将接收到的位置参数和键值参数给父类方法。通过实例我们更好的理解
class Model(object):
def __init__(self, name):
self.name = name
def save(self, force_update=False, force_insert=False):
if force_update and force_insert:
raise ValueError("Cannot perform both operations")
if force_update:
print("Updated an existing record")
if force_insert:
print("Created a new record")
定义一个类,我们可以创建类的对象,类的对象有一个方法
save()
.假设类的对象可以通过
save()
方法保存到数据库中。通过函数
save()
参数来决定是否在数据库中创建一条记录或者更新现存的记录。
构造一个新类,类有
Model
的行为,但只有符合某些条件才会保存这个类的对象。这个新类继承
Model
,重写
Model
的
save()
class ChildModel(Model):
def save(self, *args, **kwargs):
if self.name == 'abcd':
super(ChildModel, self).save(*args, **kwargs)
else:
return None
实际上对应的保存动作发生在’Model’的
save
方法中。所以我们调用子类的的
save()
方法而非’Model’的方法.子类
ChildModel
的
save()
接收任何父类save()需要的参数,并传给父类方法。因此,子类
save()
方法参数列表中有
*args
和
**kwargs
,它们可以接收任意位置参数或键值参数,常规参数列表除外。
下面创建ChildModel实体并调用save方法:
c=ChildModel('abcd')
c.save(force_insert=True)
c.save(force_update=True)
# 结果
Created a new record
Updated an existing record
这里传参数给对象的save()方法。调用的是子类的save(), 它接收一个包含关键字参数
kwargs
的字典。然后,它使用
**
将字典作为关键字参数unpack,然后将其传递给超类
save()
。因此,超类
save()
获得关键字参数
force_insert
并执行相应的操作。
5.2 *args 实现sum
def my_sum(*args):
res = 0
for val in args:
res += val
return res
l1 = [4, 8]
l2 = [1,2,3]
print(my_sum(*l1)) # 12
print(my_sum(*l2)) # 6
print(my_sum(4,5,6)) # 15
参考
python中的fun_Python fun中*args,**kwargs参数的含义和用法(*args,**kwargs),Pythonfunargskwargs,及...相关推荐
- python -m参数的含义和用法
上一篇文章介绍了python代码的计时工具line_profiler,其可以计算每行代码的运行时间,十分之好用,但是最后的一小节有说到其在计时的同时还可以生成一个结果文件,若是有需要的话可以再使用py ...
- 在python中查看关键字、需要执行_python关键字以及含义,用法
Python常用的关键字 1.and , or and , or 为逻辑关系用语,Python具有短路逻辑,False and 返回 False 不执行后面的语句, True or 直接返回True, ...
- Pytorch:variable中grad属性和backward函数grad_variables参数的含义
In [51]: x = t.arange(0,3, requires_grad=True,dtype=t.float) y = x**2 + x*2 z = y.sum() z.backward() ...
- linux中grub,nomodest,quiet等参数的含义,进入启动项之后黑屏的可能原因
1.双系统,选择启动项之后黑屏的可能原因 有可能是因为系统独立显卡的启动导致黑屏,这时如果在quiet splash之后,加上nomodeset,就可以告诉内核,系统启动过程中,暂时不运行图像驱动程序 ...
- shell 中 if then语句中会跟着-ne -ge之类的参数的含义
if [ 1 -ne 1 ];then ... fi 这是指当1不等于1时执行then后的语句 -eq:等于 -ne:不等于 -le:小于等于 -ge:大于等于 -lt:小于 -gt:大于 转载于:h ...
- python中*args和**kwargs参数的用法
在Python中的代码中,经常会见到args 和 kwargs两个词,前面通常还会加上一个或者两个星号.其实,这只是编程人员约定的变量名字,args 是 arguments 的缩写,表示位置参数:kw ...
- python中文意思k-对python中的*args与**kwgs的含义与作用详解
在定义函数的时候参数通常会使用 *args与**kwgs,形参与实参的区别不再赘述,我们来解释一下这两个的作用. *args是非关键字参数,用于元组,**kw是关键字参数 例如下面的代码 def fo ...
- python什么意思k_对python中的*args与**kwgs的含义与作用详解
对python中的*args与**kwgs的含义与作用详解 在定义函数的时候参数通常会使用 *args与**kwgs,形参与实参的区别不再赘述,我们来解释一下这两个的作用. *args是非关键字参数, ...
- args在python中什么意思_对python中的*args与**kwgs的含义与作用详解
在定义函数的时候参数通常会使用 *args与**kwgs,形参与实参的区别不再赘述,我们来解释一下这两个的作用. *args是非关键字参数,用于元组,**kw是关键字参数 例如下面的代码 def fo ...
- args在python中什么意思_Python中*args、**args到底是什么、有啥区别、怎么用
调用函数时使用*和 ** 假设有函数 def test(a, b, c) test(*args):* 的作用其实就是把序列 args 中的每个元素,当作位置参数传进去.比如上面这个代码,如果 args ...
最新文章
- python基础系列:类
- 字符串处理分割字符串
- linux脚本判断流程控制,linux shell awk 流程控制语句(if,for,while,do)详细介绍
- 安装SQL2012出现[HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD)设置为 1
- 和硬件交换方面的知识
- day26 java的集合(4)泛型 foreach Set和Map
- php avc,什么是AVC编码?简述H.264概念和发展
- maven打包时加入依赖jar包
- 关于多媒体编解码器和音视频格式
- 饿了么移动APP的架构演进
- 启动auditd时,报错如下,怎么解决?
- 《Java 程序设计任务驱动式实训教程》pdf,附下载链接
- IIS搭建本地服务器,花生壳实现外网通过域名访问网站
- UE4 昵称修改后客户端的同步
- 2021-01-22 Science对于“Misused images”图片误用的报道
- RuntimeError: iter() is only supported inside of tf.function or when eager execution is enabled.
- 金胜维固态硬盘MK8115主控开卡成功教程
- Ubuntu 20.04系统中VSCode+CMake+GTest实现C++程序自动化单元测试的详细方法
- Matlab 增加配色方案
- 刘未鹏博客精华整理55条