zoukankan      html  css  js  c++  java
  • Python中的函数及函数参数的使用

    函数:一个工具,随调随用

      降级代码冗余

      增加代码的复用性,提高开发效率,为了不成为cv战士

      提高程序扩展性

    函数有两个阶段:定义阶段,调用阶段。

    定义时:只检查函数体内代码语法,不执行函数体内代码。

    函数参数:

      参数分形参、实参

      形参:函数定义时括号内的参数

      实参:函数调用时括号内的参数

      形参相当于变量,实参相当于变量的值。

      定义时: 

          def func(a, b, c):

            pass

          a, b, c为形参

      调用时:

          func(1, 2, 3) 

          1, 2, 3 为实参

    形参:

      只在被调用时,才分配内存单元。调用结束,立刻释放所分配的内存。

      形参只在函数内部有效。

    实参:

      可以是:常量、变量、表达式、函数。

      进行函数调用时,实参必须是确定的值。

    位置参数:

      位置形参:函数定义时,从左往右写的参数,比如上面的 a, b , c

      位置实参:函数调用时,从左往右写的参数,  比如上面的 1,2,3

      位置形参定义多少个,调用时位置实参必须写上多少个,多一个少一个都不行。

    关键参数:

      正常情况下,给函数传参数,要按顺序。如果不想按顺序,就用关键参数。

      指定参数名的参数,就叫做关键参数。

      函数调用时:func(a=1, b=2),  这种指定了参数名的参数,就是关键参数。

      调用函数时,关键参数可以和位置参数一起用,但是关键参数必须在位置参数的后面。不然会报错。

    默认参数:

      函数定义时,默认参数必须在位置形参的后面。

      函数调用时,指定参数名的参数,叫关键参数。

      而在函数定义时,给参数名指定值的时候,这个参数叫做默认参数。

      关键参数,和默认参数两个参数写法一样,区别在于:

        关键参数是在函数调用时,指定实参的参数名,也可以说指定值的参数名。

        默认参数是在函数定义时,指定参数名的值。

      写法:

        def (a, b=100):

          pass

      定义时,有默认参数的话,调用时,这个实参可以不写。如果实参不写的话,这个形参的参数值是他的默认值。

    动态参数:*args  **kwargs

      *args

      针对函数定义时的*:

        def func(a, b, *args):

          pass

        *args会接收函数调用时,传入的多余的位置实参。

        *args 是一个元组

        例子:

          func(1, 2, 3, 4, 5, 6) 函数调用,因为函数定义时,*args前面有形参a, 形参b, *args就接收调用时多余的位置实参

          a为1, b为2, *args 为: (3, 4, 5, 6),是一个元组。

      

      针对函数调用时的 *:

        func(1, 2, *[1, 2, 3, 4])  ==  func(1, 2, 1, 2, 3, 4)

        函数调用时有*, 就应该立马将*后面的列表,元组,字符串之类的迭代器,打散成位置参数来看。

        注意,如果 *后面是一个字典的话,那么打散成的位置参数就是字典的key

        *可以看做是for循环。

      形参中 *args 只能接收多余的位置实参,成为一个元组。不能接收关键实参。

      

      **kwargs:

      针对函数定义时,站在形参的角度看 **:

        接收多余的关键实参,成为一个字典dict。

        字典的key是关键实参的变量名,字典的value是关键实参的值。

        将字典交给**后面的变量名,这里是kwargs

      站在实参的角度看 ** :

        d = {'x':1, 'y':2, 'z':333}

        func(**d)  # 等价于func(x=1,y=2,z=333)

        函数调用时,**后面可以接一个字典,然后**会把字典打散成关键参数的形式,也就是key=value的形式。

          

    函数定义时:

      从左往右:位置形参 > *args > 默认参数 > **kwargs

       位置形参 > 默认参数 > *args > **kwargs  也可以。

       因为函数调用时给的实参满足了位置形参、默认参数之后,会把多余的位置实参给args。这样并不会报错。

       但是 **kwargs 必须在 *args后面

       默认形参必须在位置形参后面

    函数调用时:

      从左到右:位置实参 > *args > 关键参数 > ** kwargs

       因为 * args 在函数调用时,会被打散成位置实参,而关键参数必须在位置实参的后面,否则会报错。SyntaxError: positional argument follows keyword argument

       *args 必须在 **kwargs后面, 否则会报语法错误:SyntaxError: iterable argument unpacking follows keyword argument unpacking

         

      

  • 相关阅读:
    winform登录成功后打开主窗体的合理写法
    C#将字符串转换为整型的三种方法的总结
    win7下安装Oracle11g
    无法将文件“.exe”复制到“.exe”。文件“.exe”正由另一进程使用,因此该进程无法访问该文件
    GDI+
    “System.Data.SqlClient.SqlConnection”的类型初始值设定项引发异常
    winform中为ComboBox控件添加“请选择”或“全部”选项
    IE8不能上传、插入图片的解决办法!
    asp.net mvc实现上传文件
    winform关闭窗体时确认框提示两次
  • 原文地址:https://www.cnblogs.com/KbMan/p/11160687.html
Copyright © 2011-2022 走看看