谈谈python中函数的参数
2017-09-26 00:03
246 查看
形参:定义函数时代表函数的形式参数
实参:调用函数是传入的实际参数
如:
函数形参分为普通参数,默认参数和动态参数
如:
根据调用的写法,可以分为位置参数和关键字参数
如:
调用的时候如果同时写位置参数和关键字参数,
如:
那么根据上面两条,我们还可以总结出定义函数时的规范:
1.默认参数要写在普通参数的后面
2.普通动态参数*args要写在默认参数后面
3.关键字动态参数**kwargs要写在最后面
下面介绍动态参数的运行情况
普通动态参数:
关键字动态参数:
默认参数:
默认参数的作用就是,如果我们在调用函数的时候不传入相应的参数,那么函数就用默认值
在定义函数的时候我们容易出现一个错误,如:
我们调用了两次func函数,发现输出的结果不一样。这是因为列表,字典等这样的数据类型在调用的时候是引用它们的地址。
解释器在执行x=[]的时候,x指向的一个列表的引用地址,这个列表发生变化后,x指向的地址是没有变的。
所以我们在定义函数的时候,默认参数不要定义成列表,字典等数据类型。
解决办法:
实参:调用函数是传入的实际参数
如:
def func(x, y): # x,y形参 print(x, y) func(3, 4) # 3, 4 实参
函数形参分为普通参数,默认参数和动态参数
如:
def func(x, y): # 普通参数 pass def func(x, y=10): # y=10是默认参数 pass def func(x,y=10,*args): # *args普通动态参数 pass def func(x,y=10,**kwargs): # **kwargs关键字动态参数 pass
根据调用的写法,可以分为位置参数和关键字参数
如:
def func(x, y): print('x=',x,'y'=,y) func(3,4) #我们这样调用的时候3,4叫位置参数,会根据传入的实参位置去对应形参的位置 输出结果为: x= 3 y= 4 f(x=3, y=4) f(y=4, x=3) #y=4,x=3叫做关键字参数,可以不用按照位置写
调用的时候如果同时写位置参数和关键字参数,
如:
f(x=3, 4) # 关键字参数放前面 执行结果出错: SyntaxError: non-keyword arg after keyword arg注意:关键字参数不能放在位置参数之前
func(3, x=4) 执行结果出错: TypeError: func() got multiple values for keyword argument 'x'注意:位置参数和关键字参数需要同时匹配
那么根据上面两条,我们还可以总结出定义函数时的规范:
1.默认参数要写在普通参数的后面
2.普通动态参数*args要写在默认参数后面
3.关键字动态参数**kwargs要写在最后面
下面介绍动态参数的运行情况
普通动态参数:
def func(x, *args): print(args) f(1, 2, '3', [1, 2, 3]) f(3, 2, [1, 2, 3]) 运行结果: (2, '3', [1, 2, 3]) (2, [1, 2, 3])普通动态参数将传入的所有多余的位置参数组合成一个元组。
lst = ['python', 'c', 'java'] def func(*args): print(args) func(*lst) func('python', 'c', 'java') 运行结果: ('python', 'c', 'java') ('python', 'c', 'java')将一个列表前加上*传入一个函数,相当于将这个列表中的元素按顺序传入函数。
关键字动态参数:
def func(x, y=1, **kwargs): print(x,y,kwargs) func(1, 2, z=2, f=3, d=4) func(5, 2, t=2, name='rambo', age=28) 运行结果: (1, 2, {'z': 2, 'd': 4, 'f': 3}) (5, 2, {'age': 28, 't': 2, 'name': 'rambo'})关键字动态参数会将传入的多余的关键字组合成一个字典。
dct = { 'name': 'rambo', 'age': 28 } def f(**kwargs): print(kwargs) f(**dct) f(name='rambo', age=28) 运行结果 {'age': 28, 'name': 'rambo'} {'age': 28, 'name': 'rambo'}将一个字典前加上**传入一个函数,相当于将这个字典中的键值对以关键字参数的形式传入函数。
默认参数:
默认参数的作用就是,如果我们在调用函数的时候不传入相应的参数,那么函数就用默认值
在定义函数的时候我们容易出现一个错误,如:
def func(x=[]): x.append('hello') print(x) func() func() 执行结果: ['hello'] ['hello', 'hello']
我们调用了两次func函数,发现输出的结果不一样。这是因为列表,字典等这样的数据类型在调用的时候是引用它们的地址。
解释器在执行x=[]的时候,x指向的一个列表的引用地址,这个列表发生变化后,x指向的地址是没有变的。
所以我们在定义函数的时候,默认参数不要定义成列表,字典等数据类型。
解决办法:
def func(x=None): # 这里None是一个占位符 if not x: x = [] x.append('hello') print(x) func() func() 执行结果 ['hello'] ['hello']
相关文章推荐
- 简单谈谈Python中函数的可变参数
- 简单谈谈Python中函数的可变参数
- 谈谈Python函数的默认参数
- python3.5函数的参数样式种类以及装饰器
- 利用ida python 实现复原函数调用的参数 (仅对数据被简单硬编码有效)
- Python 函数中,参数是传值,还是传引用?
- python 函数星号参数说明
- python函数之参数定义
- python-函数中的参数类型和可变参数解析
- Python之道–函数参数的传递
- Python 函数动态参数
- Python中可变参数的函数
- <python>Python的函数参数传递:传值?引用?
- Python函数中*args和**kwargs来传递变长参数的用法
- Python的函数参数传递:传值?引用?
- 【转】python函数参数的传递
- python中的函数参数详解
- Python中的函数中的参数
- python--函数2(位置参数和关键字参数)
- python中函数参数是引用还是传值