深入函数

Formal Arguments(形式参数)
Python函数的形式参数集合由在调用时要传入函数的所有参数组成,这参数与函数声明中的参数列表精确的配对。
子而写参数包括了所有必要参数:
1,位置参数
2,关键字参数
3,默认参数
4,可变长参数

位置参数
位置参数的传递必须与函数声明是定义的函数顺序匹配。

>>> def foo(name,age):
... print("My name is %s, I am %d years old" % (name,age))
...
>>> foo('alben',18)
My name is alben, I am 18 years old

如果函数定义了位置参数,那么在调用的时候,函数必须按顺序传递,如果顺序搞错就有可能发生异常
>>> foo(18,'alben')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in foo
TypeError: %d format: a number is required, not str

Python还是把18作为第一个参数传递给了函数,这时候就引发了TypeError异常,%d要求的是int不是str,传入的alben是一个str

2,关键字参数
>>> foo(age=18,name='alben')
My name is alben, I am 18 years old
这样的函数传递方式就是关键字函数,在传递的时候就不需要严格按照定义参数的顺序。

默认参数:
用途——指定默认参数,如果调用的时候没有指定实参,就用默认值作为实参。
例如:
def self_introduction(name,age,work='IT'):
print("My name is %s. I am %d years old. I am a %s enginner" %(name,age,work))

self_introduction(age=18,name='alben')

这时候,因为alben确实就是一个IT工程师,所在在调用函数的时候就不需要给work传递实参了,效果:
My name is alben.
I am 18 years old.
I am a IT enginner


Why 默认参数:
默认参数让程序的健壮性上升到极高的级别,因为它们补充了标准位置参数没有提供的一些灵活性。这种简洁极大的
帮助了程序员,当少几个需要操心的参数时候,生活就不在那么复杂。

note:
默认参数可以有多个,但是默认参数必须在形参集合的最后。


可变长度参数:
可能会有需要用函数处理可变数量参数的情况,这时可使用可变长度的参数列表。变长的参数在函数声明中不是显示的命令的,
因为参数的数目在运行之前是未知的,python用2种办法来支持可变长参数。

非关键字可变长参数(元组)
* 代表非关键字可变长参数,在声明的时候必须在默认参数后面。
例如:
>>> def foo(*arg):
... for i in arg:
... print(i)
...
>>> foo(1,2,3,4,5)
1
2
3
4
5

关键字变量参数(字典)
在我们有不定数目或者额外集合的关键字的情况下,参数被放入一个字典中,字典中的键为参数名,值为对应的参数值。
>>> def foo(**arg):
... for eacharg in arg:
... print("xarg: %s = %s" % (eacharg,arg[eacharg]))
... dict1 = arg
... return dict1
...
>>> foo(name='alben',age=18,work='enginner')
xarg: work = enginner
xarg: name = alben
xarg: age = 18
{'work': 'enginner', 'name': 'alben', 'age': 18}

原文地址:https://www.cnblogs.com/alben-cisco/p/7005742.html