Python 中函数的参数有五种:位置参数 (必选参数)、默认参数、可变参数、关键字参数、命名关键字参数。
#位置参数
- //定义位置参数函数
- def sayHello(name):
- print('hello',name)
- //调用函数
- sayHello('Tom')
调用结果: ('hello', 'Tom')
此时的 sayHello(name) 函数,参数 name 是一个位置参数。
当调用函数的时候,必须传入一个参数。其他方式调用都会报错:
- //无参数调用
- sayHello()
- TypeError: sayHello() takes exactly 1 argument (0 given)
- //多参数调用
- sayHello('Tom','Jarry')
- TypeError: sayHello() takes exactly 1 argument (2 given)
#默认参数
- //定义具有默认参数的函数
- def sayHello(name,greet='Hello'):
- print(greet,name)
- //调用函数
- sayHello('Tom')
- sayHello('Jarry','Hai')
调用结果: ('Hello', 'Tom') ('Hai', 'Jarry')
默认参数的好处不言自明,它能够简化函数的调用。设置默认参数的时候,需要注意的是:必选参数在前,默认参数在后,否则会报错。
但函数有多个默认参数时,调用的时候,既可以按顺序提供默认参数,也可以不按顺序;当不按顺序提供参数的时候,要把参数名写上。举个栗子:
- def sayHello(name,greet='hello',word='how are you?'):
- print(greet,name,word)
- sayHello('Tom',word = 'how do you do?')
调用结果: ('hello', 'Tom', 'how do you do?')
#可变参数 可变参数的函数允许传入任意个参数,这些可变参数在函数调用的时候会自动组装成一个 tuple。
- //定义可变参数的函数
- def sayHello(*saySomething):
- for tmp in saySomething:
- print(tmp)
- //调用函数 以下方式调用都没问题
- sayHello('Sawadika','Jarry')
- sayHello('nihao','BOBO','how do you do ?')
- sayHello('hello','Tom','how are you ?')
如果已经有一个 list 或者 tuple, 要调用可变参数的函数怎么办?可以这样:
- //已有的list
- somethings = ['nihao', 'Zhangye', 'how do you do ?']
- //加*即可
- sayHello( * somethings)
调用结果: nihao Zhangye how do you do
#关键字参数 关键字参数的函数允许传入任意个含参数名的参数,这些关键字参数在函数内部自动组装成一个 dict
- //定义一个关键字参数
- def sayHello(**saySomething):
- print(saySomething)
- //调用关键字参数的函数
- sayHello(name='TOM',greet='hello',word='How do you do')
- sayHello(name='BOBO',word='how are you')
- sayHello(name='JHON')
调用结果: {'word': 'How do you do', 'name': 'TOM', 'greet': 'hello'} {'word': 'how are you', 'name': 'BOBO'} {'name': 'JHON'}
与可变参数类似,如果已经有一个 dict,允许把 dict 当做参数直接传进去:
- //已有的dict
- para = {'name':'BOBO','greet':'nihao'}
- //定义关键字参数
- def sayHello(**parameters):
- if 'name' in parameters:
- print('name is',parameters['name'])
- if 'greet' in parameters:
- print('greet is',parameters['greet'])
- if 'word' in parameters:
- print('word is',parameters['word'])
- //调用
- sayHello(**para)
调用结果: ('name is', 'BOBO') ('greet is', 'nihao')
#命名关键字参数 使用关键字参数的函数,允许传入任意不受限制的关键字参数,我们只能在函数内部进行检查参数;如果要限制关键字参数的名字,就可以用命名关键字参数
- //定义一个命名关键字参数函数
- def sayHello(name, *, greet='nihao', word):
- print(greet,name, word)
- //调用
- sayHello('TOM',greet='hello',word='how are you')
- sayHello('TOM',word='how do you do')
调用结果: hello TOM how are you nihao TOM how do you do
特别注意:命名关键字参数是 python3 的语法,python2.7 不兼容。
#最后 以上介绍的函数的五种参数都可以组合使用,除了可变参数无法和命名关键字参数混合。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数 / 命名关键字参数和关键字参数。
本文整理资料来自: 参考廖雪峰的 Python 教程
来源: https://juejin.im/post/5a36313c6fb9a044fd11d84e