谈谈python中函数的参数

形参:定义函数时代表函数的形式参数
实参:调用函数是传入的实际参数



如:
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']









  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值