本系列随笔是本人的学习笔记,初学阶段难免会有理解不当之处,错误之处恳请指正。转载请注明出处:https://www.cnblogs.com/itwhite/p/12298001.html。
函数定义
示例:
def add(a, b): return a + b;
默认参数
默认参数必须在必选参数之后,示例:
def foo(a, b, c = 123, d = 'ok'): print a, b, c, d foo(1, 2) # output: 1 2 123 ok foo(1, 2, 456) # output: 1 2 456 ok
可变参数:不定参数
定义参数时,在参数名前面加入星号(*)表示可变参数(实际上是以 tuple 的形式实现的),示例:
def calc(operation, *numbers): if (operation == 'sum'): ret = 0 for n in numbers: ret += n elif (operation == 'mul'): ret = 1 for n in numbers: ret *= n else: raise Exception("Invalid operation: " + str(operation)) return ret; print calc('sum', 1, 2, 3, 4) # output: 10 print calc('mul', 1, 2, 3, 4) # output: 24 print calc('div', 1, 2, 3, 4) # Exception: Invalid operation: div
另外,python还支持将数组或tuple的内容传给可变参数,此时也需要在数组名(或tuple)前加上星号,例如:
data = [2, 3, 4] print calc('sum', *data) # output: 9 print calc('sum', *[2, 3]) # output: 5
关键字参数
类似与 perl 中以一个 hash 值(python中称为字典)来接收参数的方式,接收字典参数的参数名前需要加上两颗星(**),示例:
def foo(name, **details): print name, details foo('Jack', age = 23, email = 'jack@gmail.com') # output: Jack {'age': 23, 'email': 'jack@gmail.com'} foo('Lucy', age = 19, gender = 'female') # output: Lucy {'gender': 'female', 'age': 19}
注意:这里的字典参数的 key 是任意的,如需要限制能够传入的 key 值,需要用到下文中的“命名关键字参数”。
命名关键字参数
perl 中允许使用 Params::Validate 模块中的方法来做参数校验,可以限制参数个数和类型,python中目前还不知道如何以简单的方式限制参数类型,但是限制个数还是可以的:使用星号作为一个参数,后面跟允许传入的参数名,示例:
def foo(name, *, age, gender, email): print(name, age, gender, email) foo('Jack', age = 23, email = 'jack@gmail.com', gender = "male") # Jack 23 male jack@gmail.com foo('Lucy', age = 19, gender = 'female') # TypeError: foo() missing 1 required keyword-only argument: 'email' foo('Bob', age = 19, city = 'New York') # TypeError: foo() got an unexpected keyword argument 'city'
注意:python 3 才支持这种方式。
参数组合
在 Python 中定义函数,可以用必选参数、默认参数、可变参数和关键字参数,这4种参数都可以一起使用,或者只用其中某些,但是请注意,参数定义的顺序必须是:必选参数 => 默认参数 => 可变参数 => 关键字参数,例如:
def foo(a, b = 123, *c, **d): print(a, b, c, d) foo(1) # (1, 123, (), {}) foo(1, 2, 3, 4) # (1, 2, (3, 4), {}) foo(1, 2, 3, 4, name = "Jack", age = 23) # (1, 2, (3, 4), {'age': 23, 'name': 'Jack'})
完。