参数在python中总是通过赋值进行传递的。在默认情况下,参数是通过其位置进行匹配的,从左到右,而且必须精确的传递和函数头部参数名一样多的参数。

这种默认的传递方式很简单

def f(a,b,c):

print(a,b,c)

f(1,2,3)

1 2 3

python中可以使用基于关键字的参数匹配形式。在调用函数的时候,能够更详尽的定义内容传递的位置。关键字参数允许通过变量名进行匹配,而不是通过位置。

def f(a,b,c):

print(a,b,c)

f(c=3,a=1,b=2)

1 2 3

我们可以看出,当关键字参数使用时参数从左至右的关系已不再重要了,因为参数是通过变量名进行传递的,而不是通过其位置。这种调用显得更文档化一些(例如使用一些名称更直观的参数名)。

甚至在一个调用中混合使用基于位置的参数和基于关键字的参数也可以。在这种情况下,所有基于位置的参数首先按照从左到右的顺序匹配头部的参数,之后再进行基于变量名进行关键字的匹配。

def f(a,b,c):

print(a,b,c)

f(1,c=3,b=2)

1 2 3

再来说说python中的默认参数形式。默认参数允许创建函数可选的参数,如果没有传入值的话,在函数运行前,参数就被赋予了默认值,还是看一个例子:

def f(a,b=2,c=3):

print(a,b,c)

f(1)

1 2 3

f(a=1)

1 2 3

看到这个例子中,我们必须为a提供值,无论是通过位置参数还是关键字参数来实现,然而,为b和c提供值是可选的。如果我们不给b和c传递值,它们会分别赋值为2和3。

那么按位置顺序,当给函数传递两个值的时候,只有c得到默认值,并且当有三个值传递时,不会使用默认值。

def f(a,b=2,c=3):

print(a,b,c)

f(1,4)

1 4 3

def f(a,b=2,c=3):

print(a,b,c)

f(1,4,8)

1 4 8

最后一种情况,是关键字和默认参数一起使用的情况。关键字参数允许我们跳过有默认值的参数,但是要记住的是,首先要完成通过位置进行匹配的参数。

def f(a,b=2,c=3):

print(a,b,c)

f(1,c=6)

1 2 6

很明显,a通过位置得到了1,c通过关键字得到了6,而跳过了b,b通过默认参数得到了2.

有时看到函数定义的参数中有*和**符号,表示什么意思?

这也是python中非常有特色的:当*和**符号出现在函数定义的参数中时,表示任意数目参数收集。

先说说*,他是用元组的形式收集不匹配的位置参数。当这个函数调用时,python将所有位置相关的参数收集到一个新的元组中,并将这个元组赋值给变量args。

def f(a,*args):

print(args)

f(1,2,3,4)

(2, 3, 4)

再说说**的特性,他只对关键字参数有效。在这种情况下,**允许将关键字参数转化为字典,你能够在之后使用键调用来进行步进或字典迭代

def f(**kargs):

print(kargs)

f(a=1,b=2)

{'b': 2, 'a': 1}

最后我们来概况一下最一般的形式。即在函数头部能混合一般参数、*参数以及**去实现更加灵活的调用方式。

def f(a, *pargs, **kargs):

print(a,pargs,kargs)

f(1,2,3,x=4,y=5)

1 (2, 3) {'x': 4, 'y': 5}

这个例子中,1按位置传给a,2和3收集到pargs位置的元组中,x和y放入kargs关键字词典中

上面是在函数定义的时候写的*和**形式,那反过来,如果*和**语法出现在函数调用中又会如何呢?他会解包参数的集合。

例如,我们在调用函数时能够使用*语法,在这种情况下,它与函数定义的意思相反,他会解包参数的集合,而不是创建参数的集合。例如我们可以通过一个元组给一个函数传递四个参数,并且让python将它们解包成不同的参数。

def func(a,b,c,d):

print(a,b,c,d)

args = (1,2,3,4)

func(*args)

1 2 3 4

相似的,在函数调用时,**会以键/值对的形式解包一个字典,使其成为独立的关键字参数。

def func(a,b,c,d):

print(a,b,c,d)

kargs = {'a':1, 'b':2, 'c':3, 'd':4}

func(**kargs)

1 2 3 4

当然这种形式也是可以混合的,从左到右要以位置参数、元组解包、关键字参数、字典解包的顺序来进行

def func(a,b,c,d,e,f):

print(a,b,c,d,e,f)

args = (2, 3)

kargs = {'d': 4, 'e': 5}

func(1, *args, f=6, **kargs)

1 2 3 4 5 6

说了这些基本的知识,我们来看看一个实际应用的例子

这种支持任意参数形式的方法的一个应用点,就是实现对其他函数进行灵活调用。因为参数列表可以通过元组、字典形式传入,所以他支持运行时构建参数列表,这对于测试和计时其他函数非常方便。在下面的代码中,我们通过传递任何发送进来的参数来支持具有任意参数的任意函数:

def tracer(func, *args, **kargs):

print('calling:', func.__name__)

return func(*args, **kargs)

def func(a,b,c,d):

return a+b+c+d

print(tracer(func,1,2,c=3,d=4))

calling: func

10

很明显,这里在定义tracer函数时应用了收集任意参数的方法,在其中调用func函数时又利用了解包参数的方法。

最后综合所学,我们举一个例子,来仿写一个函数模拟print的功能,他可以接收任意的位置参数,同时接收规定范围内的关键字参数,对多余的关键字参数会报错。

import sys

def print30(*args, **kargs):

sep = kargs.pop('sep', ' ')

end = kargs.pop('end', '\n')

file = kargs.pop('file', sys.stdout)

if kargs:

raise TypeError('extra keywords:{}'.format(kargs))

output = ''

first = True

for arg in args:

output += ('' if first else sep) + str(arg)

first = False

file.write(output + end)

print30('hello','world','healthy',sep='&')

hello&world&healthy

在这段程序中,有几个关键点值得我们注意

对kargs字典进行pop操作,弹出了指定的三个关键字sep、end、file后,如果字典里还有值,则证明是多余的关键字,程序需要报错。第二在pop的时候,如果这三个参数如果在调用函数的时候指定了值,就用指定的值,如果没有指定值则用程序中指定的默认值。

从下面的例子就可以看出,使用多余的关键字,程序会报错。

print30('hello','world','healthy',sep='&',ppp='33',hhh='44')

Traceback (most recent call last):

File "E:/12homework/12homework.py", line 15, in

print30('hello','world','healthy',sep='&',ppp='33',hhh='44')

File "E:/12homework/12homework.py", line 7, in print30

raise TypeError('extra keywords:{}'.format(kargs))

TypeError: extra keywords:{'ppp': '33', 'hhh': '44'}

关于数据科学更系统、更深入的探讨可进入我们的专栏《Python数据科学之路》:酱油哥:来吧,一起踏上Python数据科学之路​zhuanlan.zhihu.com

本专栏模仿美剧剧集编排分为五季,第一季:Python编程语言核心基础、第二季:Python数据分析基本工具、第三季:Python语言描述的数学基础、第四季:机器学习典型算法专题、第五季:实战热点深度应用。

python可变参数和关键字参数位置_python中函数的默认参数和可变长参数如何排列?...相关推荐

  1. python函数定义时参数相当于占位符_python中函数的参数

    形参:定义函数时代表函数的形式参数 实参:调用函数时传入的实际参数 列如: def f(x,y): # x,y形参 print(x, y) f(1, 2) # 1, 2 实参 定义函数时,形参分为普通 ...

  2. python函数默认参数_Python中函数的默认参数问题

    前几天,运营反馈了一个BUG,某些数据在写入数据库后,其时间字段出现异常,与当前时间相差较多. 由于代码是不是我写的,所以开始一遍阅读代码一遍排查问题. 在主流程中,仅仅发现了一个对时间赋值的语句,并 ...

  3. python之33个关键字详解_Python 中的关键字 with 详解

    在 Python 2.5 中,with关键字被加入.它将常用的 try ... except ... finally ...模式很方便的被复用.看一个最经典的例子: with open('file.t ...

  4. python可变参数函数二阶导数公式_Python中函数的参数定义和可变参数

    刚学用Python的时候,特别是看一些库的源码时,经常会看到func(*args, **kwargs)这样的函数定义,这个*和**让人有点费解.其实只要把函数参数定义搞清楚了,就不难理解了. 先说说函 ...

  5. python中函数的可变参数_Python中函数的参数定义和可变参数

    转自:http://www.cnblogs.com/tqsummer/archive/2011/01/25/1944416.html 刚学用Python的时候,特别是看一些库的源码时,经常会看到fun ...

  6. python中result函数用法_python中函数的参数和返回值

    函数 目标 函数参数和返回值的作用 函数的返回值 进阶 函数的参数 进阶 递归函数 01. 函数参数和返回值的作用 函数根据 有没有参数 以及 有没有返回值,可以 相互组合,一共有 4 种 组合形式 ...

  7. ln函数怎么看奇偶性_Python中函数的参数应该怎么理解?看完这篇文章情不自禁的想收藏...

    前面给大家讲过,函数是一种编程思想,是提高代码重复利用的设计思路,是代码设计更深层次的产物.今天要给大家讲的就是函数的核心:函数的参数 基本概念 1.函数的参数:是指函数完成某项功能所需要的信息. 举 ...

  8. python闭包和装饰器的区别_python中闭包和装饰器的理解(关于python中闭包和装饰器解释最好的文章)。(转)...

    呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂.搞定装饰器需要你了解一些函数式编程的概念,当然还有理解在python中定义和调用函数 ...

  9. python中函数的定义包括_python中函数的定义及调用

    python中函数的定义及使用方法 1.函数的概念:函数是将具有独立功能的代码块组织为一个整体,使其具有特殊功能的代码集; 2.函数的作用:使用函数可以加强代码的复用性,提高程序编写的效率; 3.函数 ...

最新文章

  1. hbase.client.keyvalue.maxsize的默认值
  2. python解码base64_在python中解码Base64 Gzip
  3. Express + Element-ui 实现图片/文件上传
  4. 二叉树层次遍历c语言_[LeetCode] 107. 二叉树的层次遍历 II
  5. C++OpenCV:三角形插值、线面的交点
  6. 为什么程序员老在改 Bug,就不能一次改好吗?
  7. EasyUI加zTree使用解析 easyui修改操作的表单回显方法 验证框提交表单前验证 datagrid的load方法...
  8. 常用HDFS java API
  9. CentOS6.5恢复误删除的文件
  10. 构建工具Bazel入门
  11. usb摄像头做教学直播实现pc和手机都可以在线观看教程
  12. html如何插入下拉菜單,html下拉菜单怎么做?html下拉菜单的代码实例介绍
  13. 物联网的主要特征是什么,目前主要有哪些应用?
  14. Vue:成功解决[Vue warn]: Failed to resolve directive: modle (found in Anonymous)
  15. 有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个
  16. 四大险种之间有什么区别?理赔会冲突吗?
  17. 中国电子学会-全国青少年无人机技术等级考试标准 (1-2级)
  18. Java毕业设计 社区疫情防控管理系统
  19. 工单预约表单plus多功能预约系统支持线上支付功能
  20. 从零开始跑——《爱上跑步的十三周》

热门文章

  1. C++之invalid initialization of non-const reference of type ‘int’ from an rvalue of type ‘int’
  2. 元素周期表排列的规律_中考化学:金属活动性顺序表和元素周期表规律总结
  3. 线性代数第五版吉尔伯特课后答_线性代数同济第五版第六章课后习题答案!
  4. 清华教授转述:读博6年未毕业被认定为自控力不够,或将影响个人贷款额度
  5. 超炫酷的枪械3D动图,喜欢的不得了!
  6. 落在我手里,今天你能嫁出去算我输!
  7. 爆笑!物理书上的照片能不能好好选选啊喂!
  8. 看OpenCV如何在python中实现图像检测!
  9. 从生物神经网络到人工神经网络
  10. 百度地图大数据告诉你一线城市真相