一、形参和实参
函数定义过程中的参数叫做形参(parameter),因为它只是一个形式,表示占据一个参数位置。
函数调用过程中传递进来的值就做实参(argument),因为它是具体的参数值。
>>> def func(name):#此处的"name"就是形参 print(name) >>> func('Ginson')#此处的“Ginson”就是实参
二、函数文档
函数文档是在定义函数时,写在函数体之前的文字,这段文字不会跟函数以其被保存,但在函数被调用时不被打印。主要作用是对函数功能加以说明,使代码更易维护。
>>> def func1(name): '此函数的作用是打印参数' print(name) >>> func1('Christina') Christina #看,此处函数文档并未被打印 >>> func1.__doc__ '此函数的作用是打印参数' #可调用函数的属性来显示函数文档,doc前后为双下横线
PS:help(函数名称) 也可以显示函数文档,并且排版更易阅读
三、关键字参数
>>> def fun2(name,age): print(name+'今年'+age+'岁') >>> func2('Ginson','18') Ginson今年18岁 >>> func2('18','Ginson') 18今年Ginson岁 #函数默认是按顺序匹配实参与形参的 >>> func2(age='18',name='Ginson') Ginson今年18岁 #当参数过多时,可以直接用关键字参数来告诉函数,哪个实参对应哪个形参
四、默认参数
默认参数是定义了默认值的参数
>>> def func3(name='Ginson',age='18'): print(name+'今年'+age+'岁') #定义函数时定义默认参数值 >>> func3() #调用函数时如果参数为空则函数使用默认参数 Ginson今年18岁 >>> func3('Christina','16') #如果给了参数则使用参数值 Christina今年16岁
注意,默认参数不能放在必选参数前面,否则函数在调用参数时会产生歧义,比如下面这个例子
>>> def func5(a,b=0,c): return 0 #假如有函数如上(正常情况下是没办法这样定义函数的,解释器会报错) >>>func5(1,2) #当我调用函数并给出2个参数时,python怎么判断1、2对应a b c中哪个参数呢?
五、收集参数
收集参数就是在定义参数时,给参数名字前加上*号,表示这个参数为收集参数。收集参数的值会用一个元组打包起来。
>>> def func4(*params): print('参数长度为:',len(params)); print('第二个参数为:',params[1]); >>> func4(1,'字符串',3.1415) 参数长度为: 3 第二个参数为: 字符串
注意,如果函数中除了收集参数还有其他参数,调用函数时需要用关键字参数来给其他参数传递值,否则就会出错。
>>> def func4(*params,exp): print('参数长度为:',len(params),exp); print('第二个参数为:',params[1]); >>> func4(1,'字符串',3.1415) Traceback (most recent call last): File "<pyshell#42>", line 1, in <module> func4(1,'字符串',3.1415) TypeError: func4() missing 1 required keyword-only argument: 'exp' >>> func4(1,'字符串',3.1415,exp='啦啦啦') 参数长度为: 3 啦啦啦 第二个参数为: 字符串
###更新 2016-08-04 22:47:19###
看廖雪峰大大的教程发现,还有一种收集参数使用两个**号表示的,这种从意义上来说应该是关键词参数的收集参数,这种参数的值会作为一个dict储存起来
#函数person除了必选参数name和age外,还接受收集参数kw def person(name, age, **kw): print('name:', name, 'age:', age, 'other:', kw) #在调用该函数时,可以只传入必选参数: >>> person('Michael', 30) name: Michael age: 30 other: {} #也可以传入任意个数的关键字参数,传入时要指定参数名称和值,传入后数据会作为一个dict储存起来: >>> person('Bob', 35, city='Beijing') name: Bob age: 35 other: {'city': 'Beijing'} >>> person('Adam', 45, gender='M', job='Engineer') name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
还有一种说法时位置参数,这种实际上是根据传入值的方式来称呼的。
>>> def a(x,n): return x,n >>> a(1,2) (1, 2) >>> a(n=1,x=2) (2, 1)
比如上面这个函数,传入值时如果没有指明参数名,那就会按照定义函数时参数的顺序来赋值,1赋给x,2赋给n,这种情况下这两个参数就叫位置参数。
但是如果赋值时指定了参数名,那顺序就无所谓了。
###更新 2016-08-06 ###
关键词可变参数和命名关键词参数,之前看的鱼c教程跟廖雪峰的教程叫法不一样,搞得我开始有点蒙,总是分不清。
参数这一章看了3遍总算能理解了,但我估计之后还会出现搞不清的状况,所以最好再看几遍。
位置参数好理解
默认参数也OK一般的关键词参数OK
可变参数,需要注意传入参数的方式
命名关键字参数同样要注意传入参数的方式
PS:有疑惑时再多看看这一章评论中的实例http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431752945034eb82ac80a3e64b9bb4929b16eeed1eb9000?t=1470492809400#0