python2.7函数参数详解

函数参数的匹配原则

位置:从左至右进行匹配

一般情况下,是通过位置进行匹配,把参数值传递给函数头部的参数名称,匹配顺序为从左到右。

关键字参数:通过参数名进行匹配

调用者可以定义哪一个函数接收这个值,通过在调用的时候使用参数的变量名,使用name=value这种语法。

默认参数:为没有传入值的参数定义参数值

如果调用时传入的值过于少的话,函数能够为参数设定默认的参数值,使用name=value这种语法。

可变参数:接收任意多基于位置或关键字的参数

函数能够使用特定的参数,它们是已字符*开头,接收任意多的额外参数(这个特定常常叫做可变参数)

可变参数解包:传递任意多的基于位置或关键字的参数

调用者能够再使用*语法去将参数集合打散,分成参数。这个“*”与在函数头部的“*”恰恰相反:在函数头部它意味着收集任意多的参数,而在调用者中意味着传递任意多的参数。

匹配语法

函数参数匹配表1

语法 位置 解释
fun(value) 调用者 常规参数:通过位置进行匹配
fun(name=value) 调用者 关键字参数:通过位置进行匹配
fun(*sequence) 调用者 以name传递所有的对象,并作为独立的基于位置的参数
fun(**dict) 调用者 以name成对的传递所有的关键字/值,并作为独立的关键字参数
def fun(name) 函数 常规参数: 通过位置或变量名进行匹配
def fun(name=value) 函数 默认参数值,如果没有在调用中传递的话
def fun(*name) 函数 匹配并收集(在元组中)所有包含位置的参数
def fun(**name) 函数 匹配并收集(在字典中)所有包含关键字的参数

这些特殊的匹配模式分解到如下的函数调用和定义中:

  • 在函数调用中(在表中前4行),简单的通过变量名位置进行匹配,但是使用name=value的形式告诉python依照变量名进行匹配,这些叫做关键字参数。在调用中使用*sequence或者**dict允许我们在一个序列或字典中相应地封装任意多的位置相关或者关键字对象,并且在将它们传递给函数的时候,将它们解包为分开的、单个的参数。
  • 在函数头部,一个简单的变量名是通过位置或者变量名进行匹配的(取决于调用者是如何传递参数给它的),但是name=value的形式定义了默认的参数值。*name的形式收集了任意的额外不匹配的参数到元组中,并且**name的形式将会收集额外的关键字参数到字典中

示例:

##调用关系中的*和**参数,匹配表1的3、4行
#*参数
>>> def fun2(a,b,c,d):print a,b,c,d
...
>>> fun2(1,2,*(3,4))
1 2 3 4
#**参数
>>> def abc(a=1,b=2,c=3):
...     print a,b,c
...
>>> abc({‘a‘:10,‘b‘:20,‘c‘:30})
{‘a‘: 10, ‘c‘: 30, ‘b‘: 20} 2 3
>>> abc(**{‘a‘:10,‘b‘:20,‘c‘:30})
10 20 30

细节

如果决定使用并混合特定的参数匹配模型,python将会遵循下面的原则:

  • 在函数调用中,参数必须以此顺序出现:任何位置参数,后面跟着任何关键字参数(name=value)和*sequence形式的组合,后面跟着**dict形式。
  • 在函数(定义)头部,参数必须以此顺序出现:任何一般参数(name),后面紧跟着默认参数(name=value),如果有的话,后面是*name的形式, 后面跟着**name形式。

示例:

>>> def func4(a,b,c=1,*args,**kwargs):print a,b,c,args,kwargs
...
>>> func4(1,2,*(3,4),**{‘c‘:11,‘d‘:22})
Traceback (most recent call last):#见解释2
  File "<stdin>", line 1, in <module>
TypeError: func4() got multiple values for keyword argument ‘c‘
>>> func4(1,2,*(3,4),**{‘aa‘:11,‘d‘:22})
1 2 3 (4,) {‘aa‘: 11, ‘d‘: 22}#见解释1

解释:

1,在函数调用中*args中的值会优先匹配位置参数,剩下的才会放到args变量中;

2,调用时,**kwargs中不能包含已经赋值的位置参数的名称,除非此位置参数未赋值;

在调用和函数头部中,如果出现**kwargs的话,都必须出现在最后。如果你使用任何其他的顺序混合了参数,你将会得到一个语法错误,因为其他顺序的混合会产生歧义。

python内部是使用一下步骤来在赋值前进行参数匹配的:

1,通过位置分配非关键字参数。

2,通过匹配变量名分配关键字参数。

3,其他额外的非关键字参数分配到*args元组中。

4,其他额外的关键字参数分配到**kwargs字典中。

5,用默认值分配给在头部未得到分配的参数。

示例:

##综合调用
>>> def fun3(a,b,*args,**kwargs):
...     print a,b,args,kwargs
...
>>> fun3(3,4,5,6,7,8,x=10,y=20)
3 4 (5, 6, 7, 8) {‘y‘: 20, ‘x‘: 10}

 

参考:《python学习手册》(第四版),修改了部分语句和错误,并添加示例

时间: 2024-10-06 14:45:30

python2.7函数参数详解的相关文章

C语言中的system函数参数详解

http://blog.csdn.net/pipisorry/article/details/33024727 函数名: system 功   能: 发出一个DOS命令 用   法: int system(char *command); system函数已经被收录在标准c库中,可以直接调用 system()函数用于向操作系统传递控制台命令行,以WINDOWS系统为例,通过system()函数执行命令和在DOS窗口中执行命令的效果是一样的,所以只要在运行窗口中可以使用的命令都可以用SYSTEM()

PHP date函数参数详解

PHP date函数参数详解 作者: 字体:[增加 减小] 类型:转载 time()在PHP中是得到一个数字,这个数字表示从1970-01-01到现在共走了多少秒,很奇怪吧 不过这样方便计算, 要找出前一天的时间就是 time()-60*60*24; 要找出前一年的时间就是 time()*60*60*24*365 那么如何把这个数字换成日期格式呢,就要用到date函数了 $t=time();  echo date("Y-m-d H:i:s",$t); 第一个参数的格式分别表示: a -

CGBitmapContextCreate函数参数详解

CGBitmapContextCreate函数参数详解 函数原型: CGContextRef CGBitmapContextCreate ( void *data,   size_t width,   size_t height,   size_t bitsPerComponent,   size_t bytesPerRow,   CGColorSpaceRef colorspace,   CGBitmapInfo bitmapInfo ); 参数: data                  

Python学习笔记5:函数参数详解

一.函数的定义格式: def 函数名(参数列表): 函数体 def fun1(a, b, c): return a + b + c 二.位置传递:位置对应 print(fun1(3 ,2 ,1)) 输出: 6 三.关键字传递:位置参数要出现在关键字参数之前 print(fun1(3 ,c = 1, b = 2)) 输出: 6 四.参数默认值:可以给参数赋予默认值(default) def fun2(a, b, c = 100): return a + b + c print(fun2(1, 10

ajax中error函数参数详解

xhr.status和error函数中的status是不一样的,error函数中的status主要包括:"success"."notmodified"."error"."timeout"."parsererror",而xhr.status如下所讲. 一.error:function (XMLHttpRequest, textStatus, errorThrown) { } (默 认: 自动判断 (xml 或

Dll入口函数参数详解...

DLL程序入口点函数:DllMain,注意:大小写是区别的(仅导出资源的DLL可以没有DllMain函数). 函数原型: BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } 参数意义: ①hModule参数:指向DLL本身的实例句柄:   ②ul_reason_for_call参数:指明了DLL被调用的原因,可以有以下4个取值: 1. DLL_

vue路由导航守卫及前置后置钩子函数参数详解

首先构建一个测试demo如下图: 接着来探讨路由配置界面 import Vue from 'vue' import Router from 'vue-router' // import HelloWorld from '@/components/HelloWorld' Vue.use(Router) const router = new Router({ routes: [{ path: '/', name: 'HelloWorld', component: resolve => require

Python函数参数详解

  Python函数定义时参数灵活,使用不同参数的组合不仅可以简化调用者的代码,还可以处理复杂的参数.函数的参数除了有必选参数外,还可以使用默认参数,可变参数,关键字参数和命名关键字参数. 位置参数 定义一个计算x^2的函数,以及一个计算x^n的函数 def calc1(x): return x * x def calc2(x, n): s = 1 for i in range(n): s *= x return s 对于这两个函数,其参数都是位置参数,同时也是必选参数,调用函数时实参需和形参一

函数参数详解

实参 ''' 位置实参:不用明确形参名的传参方式,一定按照位置给形参传值 关键字实参:必须明确形参名字与值为形参传值,可以不用按照位置 ***** 注:混用 1.关键字实参必须出现在位置实参后 2.多个位置实参还是按照位置传参 3.关键字实参为没有从位置实参拿到值的形参传值,可以不用按照指定顺序 ''' def fn2(a, b, c, d, e, f): print(a, b, c, d, e, f) fn2(10, 20, 30, e=100, f=500, d=200) 位置形参的范畴 位