python函数定义及作用域

函数

  • 按照过程编写代码,一般功能都是一次性的,非常不好维护,把功能封装集成,方便二次开发和维护

  • 语法定义:在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。

    def func_name(arg):#函数名,参数
        statement  #要执行的代码
        return value #返回结果,不写返回值默认返回None
  • 函数参数:

    • 形参:就是个变量名

    • 实参:变量名引用实际传进去的值

      def func(a):#形参
          pass
          return a
      a = 3 #实参
  • 参数探究:

    • 必备参数:在形参确定的情况下,实参按照参数顺序传参。

      def func(a,b):
          print(a+b)
          
      a = 5
      b = 3
      func(a)
      8
    • 默认参数:也叫缺省参数,在函数定义时,指明一个形参的默认值,就可以不给这个具有默认值的形参传递实参了。当你给一个具有默认参数的形参传递一个实参,那么会覆盖掉原有的默认值。缺省参数的定义顺序一定是从右向左,从后向前。

      缺省参数的定义顺序一定是从右向左,从后向前

    • 命名参数:参数太多的情况下,记不住顺序就会用到命名传参。

    • 不定长参数:不定长传参可接受空值

      • 元组不定长:*args表示元组形式传参

        def func(*args):
            print(args)
            print(*args)
        func('d',[1,2],{'k':5})
        ​
        ('d', [1, 2], {'k': 5})
        d [1, 2] {'k': 5}
      • 字典不定长:**kwargs字典传参

        def func(**kwargs):
            print(kwargs) #不定长传参(命名传参)成字典
            #print(**kwargs) 直接报错 不让你用
        func(a={'name':'小明','sex':'man'},b=2,c=3)
        ​
        {'a': {'name': '小明', 'sex': 'man'}, 'b': 2, 'c': 3}
      • 联合使用:

        def func(*args,**kwargs):
            print(args,kwargs)
        args = [1,2]
        kwargs={'f':3}
        func(*args,**kwargs)
        ​
        (1, 2) {'f': 3}
    • 参数解构:参数解构发生在函数调用时,可变参数发生函数定义的时候。参数解构分为两种形式,一种是必备参数解构,另一种是不定长参数解构。

      • 必备参数解构:*号会自动把对应索引位置上的实参传进来

      def func(a,b,c):
          print(a,b,c)
      lst = [1,2,3]
      func(*lst)
      ​
      1 2 3
      • 不定长参数解构:**把key对应value值传进来,key必须和形参相同

      def func(a,b,c):
          print(a,b,c)
      lst = {'a':2,'b':3,'c':6}
      func(**lst)
      ​
      2 3 6

函数作用域

  • 局部变量:生存在函数运行期间,函数运行完就死了

    def func():
        a = 1 #局部变量
        pass
    • 想要局部变量存活下来,一个办法把它赋给返回值,另一种是使用global声明局部变量变为全局变量。

      def func():
          global a
          a = 1   
          pass
      print(a)
      ​
      1
  • 全局变量:存活在整个程序

  • 不可变数据局部变量改变不会影响到全局变量

    a = 'd'#全局变量
    def func():
        a = 'l'
        print('',a)
    func()
    print('',a)
    ​
    内 l
    外 d
  • 可变数据局部变量改变会影响到全局变量,也可以说可变数据就是全局的。

    a = [1,2]
    def func():
        a[0] = 'l'
        print(a)
    func()
    print(a)
    ​
    ['l', 2]
    ['l', 2]
  • 局部变量与全局变量只是变量名的地址不同,值地址相同

    a = 1
    def function():
        a = 1
        print(id(a))
    
    function()
    print(id(a))
    1800823008
    1800823008

     

posted @ 2018-11-06 15:43  Kmnskd  阅读(983)  评论(0编辑  收藏  举报