python中函数参数,函数调用参数传递,可变参数,*expression,**expression

来源:互联网 发布:1.76我本沉默复古淘宝 编辑:程序博客网 时间:2024/04/27 22:57

1、当调用函数时,会想函数传递参数值,主要分为两种参数:

   1)  关键字参数,在函数被调用时,采用函数定义时的默认值(=标识)或者给其传递字典参数,通过**expression。

           例如:

            def complex(imag=1,real=2)://采用默认值的参数需要放到参数的最后面

print real,imag

    complex(real=2,imag=3)

    complex(imag=3)

            complex(**{"real":3,"imag":5})//字典

            

             //具体的*expression和**expression使用方法在后面介绍

    2)  定位参数,定位参数通常被定义在函数参数列表的前面或者通过*expression表达式的迭代器过程传递参数。

             例如:

             def complex(imag,real)://采用默认值的参数需要放到参数的最后面

                 print real,imag

             complex(3,5)

             complex(*(2,5))


2、可变参数,*identifier以及**identifier

      最近在看django wsgi源码的时候遇到可变参数即func(*args,**kwargs)的函数定义,开始有点模糊,不知道是神马意思,我们现在通过python官方函数手册来看看可变参数的使用方法:

      给函数传递参数时,严格意义上传递的参数个数必须和函数定义式参数个数相同,否则会报错。但是有时我们定义函数时并不能提前知道参数的个数(就像c语言里面的printf函数),此时我们可以使用*或者**来传递可变参数:

      1)带*的参数,会将剩下的参数以元组的形式传递给args参数:            

           def complex(a,b,*c)://采用默认值的参数需要放到参数的最后面

                 print a,b

                 print type(c)

                 print c

           complex(1,2,3,4,5,6)

           调用complex的结果如下:

           1 2

          <type 'tuple'>

        (3,4,5,6)

           从结果可以看出,函数将(3,4,5,6)作为元祖传给了参数c.

      2) 带**的参数,会将剩下的参数以字典的形式传递给kargs:

           def complex(a,**c)://采用默认值的参数需要放到参数的最后面

                 print a

                 print type(c)

                 print c

            调用complex(1,c='abc',d='bcd')的结果:

             1
             <type 'dict'>
             {'c': 'abc', 'd': 'bcd'}

            从结果看出,函数将(c='abc',d='bcd')参数以字典的形式传递给c

3、*expression,**expression 

      1)如果*expression出现在函数调用中,此表达式的值必须是一个迭代器,会依次传递给位置参数。

           有一种情况例外,如果*expression出现在一些关键词参数之后,那么在处理关键词参数传递之前,会先       处理*expression参数:

       

   >>> def f(a, b):   ...  print a, b   ...   >>> f(b=1, *(2,))   2 1   >>> f(a=1, *(2,))   Traceback (most recent call last):     File "<stdin>", line 1, in ?   TypeError: f() got multiple values for keyword argument 'a'   >>> f(1, *(2,))   1 2

       从上面看出,当将关键字参数和*expression同时使用时会有不同的结果 。一个是(1 2),一个结果是(2 1)       

      2)如果**expression出现在函数调用中,表达式必须是一个映射,映射的内容,在传递过程中,会被当做关键字参数传递。当表达式中关键字和通常意义的关键字传递的key相同时,会提示TypeError 异常。

        def f(a,b):

            print a,b

       f(**{'a'=123,'b'=456})

       f(a=123,**{'a'=123,'b'=456})//会报TypeError

           

0 0
原创粉丝点击