函数参数

形参与实参

       1,形参:指的是在定义函数时括号内定义的参数,就是变量名    

例:  #x,y是形参
    def func(x,y): #x=10,y=11
    print(x)
    print(y)

       2,实参:指的是在调用阶段括号内定义的参数,就是变量的值

             例:  

      #10,11是实参
      func(10,11)

注意:实参值与形参的绑定关系只有在函数调用时才会生效,在函数调用结束后就会立刻解除绑定




位置参数:位置参数指的是按照从左至右的顺序依次定义的参数,
        在定义函数时,按照位置定义的形参称为位置参数

1,位置形参:
       在定义函数时,按照位置定义的形参称为位置形参
       在调用函数时必须为其传值,而且要不多不少
   例:      def foo(x,y,z):
print(x,y,z)
             foo(1,2)      #报错,实参数值个数不够
foo(1,2,3,4) #报错,实参数值过多


2,关键字参数:
在调用函数时,按照key=value的形式定义的实参,叫关键字参数
例:
def foo(x,y,z): 
print(x,y,z)

foo(x=1,y=2,z=3) #关键字参数

注意:
1,实参相当于指名道姓的为形参传值,而且没有顺序的限制
2,位置实参与关键字实参混合使用时,必须遵循形参的规则
3,位置实参与关键字实参混合使用时,不能为同一个形参传值
4,位置实参与关键字实参混合使用时,位置实参必须放到关键字实参前面

3,默认参数:
在定义阶段,已经为某个形参赋值,那么该形参就称为默认参数,在定义阶段已经有值,意味着
调用阶段可以不传值。

例:
def register(name,age,sex='male'): #定义阶段“sex”已经赋值给“male”
print(name,age,sex)


register('egon',18,) #调用阶段就可以不用赋值(这种方法使用是在实参的某个值基本相同的情况下使用默认参数)
register('alex',73,'female')
register('wxx',84,)
register('xxx',84)


注意:
1,位置形参必须在默认参数的前面
2,默认参数的值只能在定义阶段被赋值一次,也就是说默认参数的值再定义阶段就固定死了。
例:m=10
def foo(x,y=m)
print(x,y)

m='aaaaaaaa' #因为m事先定义了等于十,所以这里再赋值不会影响函数内y的值,只能被赋值一次
foo(1) #打印1,10
foo(1,11)
3,默认参数的值应该设置为不可变类型

应用:
对于经常需要变化的值,需要将对应的形参定义成位置形参
对于大多数情况值都一样的情况,需要将对应的形参定义成默认形参


4,可变长参数:
可变长指的时实参指的个数不固定,实参有按位置定义的实参和关键字定义的实参,所以可变长的实参指的就是
按照者两种形式定义的实参个数可以不固定。
然后实参终究是要给形参传值的,所以形参必须有两种对应的解决方案来分别处理以上两种形式可变长度的实参
形参:*和**

*args:会将溢出的位置实参全部接收,然后保存成元组给args(args是一个变量名没有特定的意义可以用任意变量名,只是大家一般约定使用args)

    例:  def foo(x,y,z,*args):
       print(x,y,z)
       print(args)

       foo(1,2,3,4,5,6,7,8,) #x=1,y=2,z=3,args=(4,5,6,7,8)
         **kwargs:将溢出的关键字实参全部接收,以字典的形式给到kwargs(kwargs也是约定俗称,没有特定意义)

例:
        def foo(x,y,z,**kwargs): 
         print(x,y,z)
         print(kwargs)

        foo(x=1,y=2,z=3,a=1,b=2,c=3) #打印1,2,3,kwargs={’a‘:1,’b‘:2,’c‘:3}

实参*跟**:
       1,一旦碰到实参加*,就把该实参的值打散
     例:   def foo(x,y,z,*args):     #args=([4,5,6,7,8],)
         print(x,y,z)
        print(args)

        foo(1,2,3,*[4,5,6,7,8])     #foo(1,2,3,4,5,6,7,8)
        foo(1,2,3,*(4,5,6,7,8))     #foo(1,2,3,4,5,6,7,8)
         foo(1,2,3,*'hello')       #foo(1,2,3,'h','e','l','l','o')

        2, 一旦碰到实参加**,就把该实参的值打散:打散字典,然后以key=value的形式表现出来
     例:   def foo(x,y,z,**kwargs):
        print(x,y,z)
        print(kwargs)

        foo(1,2,3,**{'a':1,'b':2}) #foo(1,2,3,b=2,a=1)






























posted @ 2018-03-27 16:32  鲁之敬  阅读(127)  评论(0编辑  收藏  举报