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,及...相关推荐

  1. python -m参数的含义和用法

    上一篇文章介绍了python代码的计时工具line_profiler,其可以计算每行代码的运行时间,十分之好用,但是最后的一小节有说到其在计时的同时还可以生成一个结果文件,若是有需要的话可以再使用py ...

  2. 在python中查看关键字、需要执行_python关键字以及含义,用法

    Python常用的关键字 1.and , or and , or 为逻辑关系用语,Python具有短路逻辑,False and 返回 False 不执行后面的语句, True or 直接返回True, ...

  3. 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() ...

  4. linux中grub,nomodest,quiet等参数的含义,进入启动项之后黑屏的可能原因

    1.双系统,选择启动项之后黑屏的可能原因 有可能是因为系统独立显卡的启动导致黑屏,这时如果在quiet splash之后,加上nomodeset,就可以告诉内核,系统启动过程中,暂时不运行图像驱动程序 ...

  5. shell 中 if then语句中会跟着-ne -ge之类的参数的含义

    if [ 1 -ne 1 ];then ... fi 这是指当1不等于1时执行then后的语句 -eq:等于 -ne:不等于 -le:小于等于 -ge:大于等于 -lt:小于 -gt:大于 转载于:h ...

  6. python中*args和**kwargs参数的用法

    在Python中的代码中,经常会见到args 和 kwargs两个词,前面通常还会加上一个或者两个星号.其实,这只是编程人员约定的变量名字,args 是 arguments 的缩写,表示位置参数:kw ...

  7. python中文意思k-对python中的*args与**kwgs的含义与作用详解

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

  8. python什么意思k_对python中的*args与**kwgs的含义与作用详解

    对python中的*args与**kwgs的含义与作用详解 在定义函数的时候参数通常会使用 *args与**kwgs,形参与实参的区别不再赘述,我们来解释一下这两个的作用. *args是非关键字参数, ...

  9. args在python中什么意思_对python中的*args与**kwgs的含义与作用详解

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

  10. args在python中什么意思_Python中*args、**args到底是什么、有啥区别、怎么用

    调用函数时使用*和 ** 假设有函数 def test(a, b, c) test(*args):* 的作用其实就是把序列 args 中的每个元素,当作位置参数传进去.比如上面这个代码,如果 args ...

最新文章

  1. python基础系列:类
  2. 字符串处理分割字符串
  3. linux脚本判断流程控制,linux shell awk 流程控制语句(if,for,while,do)详细介绍
  4. 安装SQL2012出现[HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD)设置为 1
  5. 和硬件交换方面的知识
  6. day26 java的集合(4)泛型 foreach Set和Map
  7. php avc,什么是AVC编码?简述H.264概念和发展
  8. maven打包时加入依赖jar包
  9. 关于多媒体编解码器和音视频格式
  10. 饿了么移动APP的架构演进
  11. 启动auditd时,报错如下,怎么解决?
  12. 《Java 程序设计任务驱动式实训教程》pdf,附下载链接
  13. IIS搭建本地服务器,花生壳实现外网通过域名访问网站
  14. UE4 昵称修改后客户端的同步
  15. 2021-01-22 Science对于“Misused images”图片误用的报道
  16. RuntimeError: iter() is only supported inside of tf.function or when eager execution is enabled.
  17. 金胜维固态硬盘MK8115主控开卡成功教程
  18. Ubuntu 20.04系统中VSCode+CMake+GTest实现C++程序自动化单元测试的详细方法
  19. Matlab 增加配色方案
  20. 刘未鹏博客精华整理55条

热门文章

  1. php基础语法学习汇总
  2. 线性支持向量分类机及其实现
  3. System level Programming study(1)
  4. 实用网站、软件、App分享
  5. 分类目录管理系统——软件开发项目实践
  6. 关于Lambda表达式的简单理解,以及基础使用,仅限新手
  7. SQL order by的用法
  8. ASPNET2.0 发布问题
  9. HA模式下的java api访问要点
  10. 疯狂的图形(利用C# + GDI plus模拟杂乱无章的现实场景)