函数

 

'''
站在实参的角度上
位置传参
关键字传参
必须先按位置传参,再按关键字传参
不能给同一个变量传多个值

站在形参的角度上
位置参数:必须传,且有几个参数就传几个值

先定义位置参数,再定义默认参数
'''


def my_add(a, b):
    res = a + b
    return res


ret = my_add(1, b=2)
ret = my_add(b=2, a=1)
print(ret)


def classmate(name, sex=''):  # 默认参数:可以不传参数,如果不传就使用默认值,如果传了,就用传的
    print('{}:{}'.format(name, sex))


classmate('alex')

 

定义顺序:位置参数,*args,默认参数,**kwargs

# 动态参数:可以接收,不能接受关键字传参
def sum(*args):
    print(args)  # args是一个元组
    n = 0
    for i in args:
        n += i
    print(n)


sum(1, 2, 3)
sum(2, 5, 7, 10)

#可接受关键字传参的动态参数
def func(**kwargs):
    print(kwargs)
    for k, v in kwargs.items():
        print(k, v)


func(a=1, b=2, c=3)

def func1(*args, **kwargs):
    print(args, kwargs)


#*args: 接受的是按照位置传参的值,组织成元组
#**kwargs:接受的是按照关键字传参的值,组织成字典
#定义顺序:先位置参数,再动态参数,再关键字参数
#定义顺序:*args必须在**kwargs之前
#定义顺序:位置参数,*args,默认参数,**kwargs

 

def func(*args):
    print(args)


l = [1, 2, 3, 4, 5]
func(*l) #传参时,给序列加*,相当于拆包传递的可迭代对象依次传参


def func1(**kwargs):
    print(kwargs)

d = {'a':1, 'b':2}
func1(**d) #给序列加**,拆包字典的value

#函数的注释
def func(a, *args, **kwargs):
    '''
    函数实现了什么功能
    :param a:
    :param args:
    :param kwargs:
    :return:
    '''
    print(a, args, kwargs)

 

#默认参数的陷阱

def qqxing(l = []):
    l.append(1)
    print(l)

qqxing()    #[1]
qqxing()    #[1,1]
qqxing([])  #[1]
qqxing()    #[1,1,1]
qqxing()    #[1,1,1,1]

#如果默认参数的值是可变数据类型,那么每次调用函数时,如果不传参,就共用这个数据资源

 

posted @ 2020-03-27 22:15  vivagoal  阅读(69)  评论(0)    收藏  举报