函数的参数

  一、形参和实参

  函数定义过程中的参数叫做形参(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

原文地址:https://www.cnblogs.com/ginsonwang/p/5164781.html