函数参数:必选参数、默认参数、可选参数、关键字参数

########################################################

默认参数:放在必选参数之后

计算x平方的函数:


1. def power(x):  
2.       return x*x

    1. power(5)

    Python命令行可选参数 可选参数 python_默认参数

    计算x的立方


    1. def power(x):  
    2.       return x*x*x

    Python命令行可选参数 可选参数 python_ci_02

    这样的话每次计算不同幂函数都要重写函数,非常麻烦,可使用以下代码计算:

    1. def power(x, n):  
    2.       s=1  
    3.       while n>0:  
    4.              n=n-1  
    5.              s=s*x  
    6.       return s

     

    Python命令行可选参数 可选参数 python_默认参数_03

    使用修改后的power函数,可以计算任意n次方

    不过每次调用函数必须输入两个参数,使用默认参数可以进一步简化函数:

      1. def power(x, n=2):  
      2.       s=1  
      3.       while n>0  
      4.             n=n-1  
      5.             s=s*x  
      6.       return s

      Python命令行可选参数 可选参数 python_Python命令行可选参数_04

      设置默认参数时注意事项:必选参数在前,默认参数在后

      默认参数最大好处:降低调用函数的难度

      学生注册,需要传入name和gender:

      1. def enroll(name, gender):  
      2.       print 'name :',name  
      3.       print 'gender :',gender

      如果继续传入年龄、城市等信息咋么办,这会使得调用函数的复杂度大大增加:

      把年龄、城市设为默认参数可以简化函数:

      1. def enroll(name, gender, age=6, city='Beijing'):  
      2.        print 'name :',name  
      3.        print 'gender :',gender  
      4.        print 'age :',age  
      5.        print 'city :',city

       

      Python命令行可选参数 可选参数 python_Python命令行可选参数_05

      有多个默认参数化时,调用的时候,既可以按顺序提供默认参数,比如调用enroll('zj', 'M', 8);也可以不按顺序提供部分默认参数,如enroll('Ad', 'a', city='dad')

      默认参数也有缺陷的地方:

        1. def add_end(L=[]):  
        2.       L.append('END')  
        3.       return L

        Python命令行可选参数 可选参数 python_Python命令行可选参数_06

        原因:函数在定义时,默认参数L所制定的地址已经确定,而L是一个list,所以每次调用该函数时,如果改变了L的内容,则下次调用时,默认参数的内容就会改变

        note: 默认参数必须指向不变对象!!!

        如上代码可使用None实现:


        1. def add_end(L=None):  
        2.       if L is None:  
        3.          L=[]  
        4.       L.append('END')  
        5.       return L

         

        Python命令行可选参数 可选参数 python_默认参数_07

        ##################################################################

        可变参数:就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个

        在参数前面加上*就是可变参数。在函数内部,参数numbers接收得到的是一个tuple,调用该函数时,可以传入任意个参数,包括0个参数:

          1. def calc(*numbers):  
          2.       sum=0  
          3.       for n in numbers:  
          4.            sum= sum+n*n  
          5.       return sum

          Python命令行可选参数 可选参数 python_默认参数_08

          如何调用一个list或者tuple,可以如上所示,在list或tuple前面加上一个*号,把list或tuple的元素变成可变参数传进去

          ####################################################################

          关键字参数

          允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装成一个dict

          使用**表示关键字参数

          Python命令行可选参数 可选参数 python_ci_09

          函数person不仅可以只传入必选参数,也可以传入任意个数的关键字参数

          也可以类似可变参数,先组装一个dict,然后,把该dict转换为关键字参数传进去:

            1. kw={'city':'Beijing',  'job':'Engineer'}  
            2. person('Jack', 24, city=kw['city'], job=kw['job'])  
            3. person('Jack' ,24, **kw)

            Python命令行可选参数 可选参数 python_Python命令行可选参数_10

            #############################################################

            参数组合

            参数定义的顺序:必选参数、默认参数、可变参数和关键字参数

            Python命令行可选参数 可选参数 python_默认参数_11

            #######################################################

            in summary:

            默认参数一定要用不可变对象,如果是可变对象,运行会有逻辑错误!

            *args是可变参数,args接收的是一个tuple;

            **kw是关键字参数,kw接收的是一个dict