python参数传递

一、函数调用时,实参带有“**”代表了实参是字典,unpack之后传递;实参带有“*”代表了实参是列表,unpack之后传递

 

函数定义

def myfunc(x, y, z, a):

    print(x + y)

1.传递字典:

        dict={'x':1,'y':2,'z':3,'a':4}

        myfunc(**dict)

        3

2.传递列表

        list=[1,2,3,4]

        myfunc(*list)

        3

3.普通传递

       myfunc(1,2,3,4)

 

 

二、 优先级:F(arg1,arg2,...)> F(arg1,arg2=value2,...agrN=valueN)>  F(*arg1)> F(**arg)

函数定义时:形参带有"**",代表了前面的参数赋值之后,再将剩余的键值对存储在"**"定义的形参中,形参带有"*",代表了前面的参数赋值之后,再将剩余的值存储在"*"定义的形参中

 

  1. 函数定义:

    def myfunc1(x,y,*z):

       print(len(z))

 

第一次调用:myfunc1(1)

结果:TypeError: myfunc1() missing 1 required positional argument: 'y'

第二次调用:myfunc1(1,2)

结果:0

第三次调用:myfunc1(y=2,1)

结果:SyntaxError: positional argument follows keyword argument

原因:此时程序不知道x的值

第四次调用:myfunc1(1,x=2,1)

结果:SyntaxError: positional argument follows keyword argument

原因:这种显式赋值一般放在最后

第五次调用:myfunc1(1,2,3,4,m=6)

结果:TypeError: myfunc1() got an unexpected keyword argument 'm'

原因:m=6这样的键值对存储不到列表中

 

  1. 函数定义:

    def myfun2(x,y,**z):

      print(len(z))

 

第一次调用:myfun2(1,2,3)

结果:TypeError: myfun2() takes 2 positional arguments but 3 were given

第二次调用:myfun2(1,2,z=3)

结果:1

第三次调用:dict={'x':1,'y':2,'z':3,'a':4}

myfun2(1,2,**dict)

结果:myfun2() got multiple values for argument 'x'

原因:因为dict中又指定了x,造成了重复参数指定

 

第四次调用:dict={'a': 4, 'z': 3}

myfun2(1,2,**dict)

结果:2

第五次调用:list=[1,2,3,4]

myfun2(1,2,*list)

结果:TypeError: myfun2() takes 2 positional arguments but 6 were given

原因:list解压之后参数就多了

 

  1. 函数定义:此时需要显式指明z的值

    def myfun4(x,*y,z):

       print(x,z,len(y)

 

第一次调用:myfun4(1,2,3,z=4)

结果:1 4 2

 

第二次调用:myfun4(1,2,3,4)

结果:TyeError: myfun4() missing 1 required keyword-only argument: 'z'

 

 

 

你可能感兴趣的:(python参数传递)