第四章 函數之參數、做用域

4.2 參數

  1. 形參、實參

      def get_data(a):#a爲形式參數(或形參) 
    v = [1,5,6,,8,5]
    print(v[a])
    get_data(1)# 1在調用函數是傳遞叫:實際參數(實參)
    # 嚴格按照順序傳參數:位置方式傳參。
    # 實際參數能夠是任意類型。
  2. 基本參數

    • 任意個數python

    • 任意類型app

      def func(a1,a2,a3):
        print(a1,a2,a3)    
    func(1,"asdf",True) # 1 asdf True
  3. 位置傳參(調用函數並傳入函數)【執行】

       def func(a1,a2):
    print(a1,a2)
    func(11,22) # 11 22
  4. 關鍵字傳參 【執行】

      # 典例一
    def func(a1,a2):
    print(a1,a2)
    func(a2=11,a1=22) # 22 11

    # 典例二
    def func(a1,a2):
    print(a1,a2)
    func(11,a2=22) # 11 22
      • 位置傳參>關鍵字傳參(順序)ide

      • 位置傳參 + 關鍵字傳參 = 總傳參個數函數

      • 前面是關鍵字傳參,後面也必須關鍵字傳參ui

  5. 默認參數 【參數】 對於函數的默認值慎用可變類型

      # 若是要想給value設置默認是空列表

      # 不推薦(坑)
    def func(data,value=[]):
       pass

    # 推薦
    def func(data,value=None):
        if not value:
           value = []
           
    # 練習    
    def func(data,value=[]):
       value.append(data)
       return value

    v1 = func(1) # [1,]
    v2 = func(1,[11,22,33]) # [11,22,33,1]
    •  def func(a,b=[]) 有什麼陷阱?spa

     
    # 典例一
    def func(a,b=[]):
        b.append(a)
        return b
    ​
    l1 = func(1)
    print(l1)   # [1]
    l2 = func(2,[11,22])
    print(l2)   # [11,22,2]
    l3 = func(3)
    print(l3)   # [1,2]
    # 示例二
    def func(a,b=[]):
        b.append(a)
        print(b)
        
    func(1) # [1]
    func(2,[11,22,33])  # [11,22,33,2]
    func(3) # [1,3]
    def func(a1,a2,a3=9,a4=10):
        print(a1,a2,a3,a4)
    ​
    func(11,22) # 11,22,9,10
    func(11,22,10)  # 11,22,10,10
    func(11,22,10,100)  # 11,22,10,100
    func(11,22,10,a4=100)   # 11,22,10,100
    func(11,22,a3=10,a4=100)    # 11,22,10,100
    func(11,a2=22,a3=10,a4=100)     # 11,22,10,100
    func(a1=11,a2=22,a3=10,a4=100)      # 11,22,10,100
    View Code

     

  6. 萬能參數【打散】

    1. *args3d

      • 能夠接受任意個數的位置參數,並將參數轉換成元組.code

        • 調用函數無 *blog

           def func(*args):
             print(args)

          func((1,2,3,4)) # ((1,2,3,4),)
          func([1,2,3,4]) # ([1, 2, 3, 4],)
        • 調用函數有 *作用域

          def func(*args):
             print(args)

          func(*(1,2,3,4)) # (1, 2, 3, 4)
          func(*[1,2,3,4]) # (1, 2, 3, 4)
      • 只能用位置傳參

        def func(*args):
           print(args)

        func(1) # ()
        func(1,2) # (1,2)
        func((11,22,33,44,55)) # ((11,22,33,44,55),)
        func(*(11,22,33,44,55)) # (11,22,33,44,55)
    2. **kwargs

      • 能夠接受任意個數的關鍵字參數,並將參數轉換成字典。

        • 調用函數無 **

          def func(**kwargs):
             print(kwargs)

          func(k1=1,k2="alex") # {'k1':1,'k2':'alex'}
        • 調用函數有**

          def func(**kwargs):
             print(kwargs)
          func(**{'k1':'v2','k2':'v2'}) # {'k1':'v2','k2':'v2'}
      • 只能用關鍵字傳參

      • 綜合應用:無敵 + 無敵 => 真無敵

        def func(*args,**kwargs):
           print(args,kwargs)

        func(1,2,3,4,5,k1=2,k5=9,k19=999)#(1, 2, 3, 4, 5) {'k1': 2, 'k5': 9, 'k19': 999}
        func([1,2,3],k1=2,k5=9,k19=999)# ([1, 2, 3],) {'k1': 2, 'k5': 9, 'k19': 999}
        func([1,2,3],**{'k1':1,'k2':3})# (1, 2, 3) {'k1': 1, 'k2': 3}
        func(111,222,*[1,2,3],k11='alex',**{'k1':1,'k2':3})#(111, 222, 1, 2, 3) {'k11': 'alex', 'k1': 1, 'k2': 3}
  7. 參數相關重點:

    1. 定義函數

      def func1(a1,a2):
        pass

      def func2(a1,a2=None):
        pass

      def func3(*args,**kwargs):
        pass
    2. 調用函數

      位置參數 > 關鍵字參數

4.3 做用域

  1. python中

    • py文件:全局做用域

    • 函數:局部做用域

      a = 1
      def s1():
         x1 = 666
         print(x1) #666
         print(a) #1
         print(b) #2

      b = 2
      print(a) #1
      s1()
      a = 88888
      def s2():
         print(a,b) #88888,2
         s1() #666,88888,2

      s2()
  2. 一個函數是一個做用域

     def func():
       x = 9
       print(x) #9
    func()
    print(x) #9
  3. 做用域中查找數據規則:

    • 優先在本身的做用域找數據,本身沒有就去 "父級" -> "父級" -> 直到全局,所有麼有就報錯。注意:父級做用域中的值究竟是什麼?

      # 示例一
      x = 10
      def func():
          x = 9
          print(x)    #9
      ​
      func()
      ​
      # 練習題
      x = 10
      def func():
          x = 9
          print(x)    #9
          def x1():
              x = 999
              print(x)    # 999
      ​
      func()
      ​
      x = 10
      def func():
          x = 9
          print(x)    # 9
          def x1():
              x = 999
              print(x)    # 999
          print(x)    # 9
          x1()
      ​
      func()
      View Code

       

  4. 子做用域中只能 找到父級中的值 ,默認沒法從新爲父級的變量進行賦值,但能夠修改。(global/nonlocal能夠強制作)

    • global :對全局的變量進行賦值

    • nonloca : 找到上一級的局部變量進行賦值

    # 示例一
    name = 'oldboy'
    def func():
        name = 'alex' # 在本身做用域再建立一個這樣的值。
        print(name)# alex
    func()
    print(name)# oldboy
    # 示例二
    name = [1,2,43]
    def func():
        name.append(999)
        print(name) # [1, 2, 43, 999]
    func()
    print(name) #[1, 2, 43, 999]
    # 示例三
    name = ["老男孩",'alex']
    def func():
        global name
        name = ''
        print(name) #
    func()
    print(name) #
    # 示例四
    name = "老男孩"
    def func():
        name = 'alex'
        def inner():
            global name
            name = 999  
        inner()
        print(name) # alex
    func()
    print(name) # 999
    ​
    ​
    ​
    # 示例五
    name = "老男孩"
    def func():
        name = 'alex'
        def inner():
            nonlocal name # 
            name = 999
        inner()
        print(name) # 999
    func()
    print(name) # 老男孩
    View Code

     

  5. 總結

    • 參數

      • 調用(執行)函數時,傳參:位置參數 > 關鍵字參數

      • 定義函數:

        • def func(a)

        • def func(a,b=None) # 對於默認值,若是是可變類型,----> 坑。

        • def func(*args,**kwargs)

    • 做用域

      • 函數爲做用域

      • 本身 > 父級 > 父級 > 全局 【讀/修改(可變)】

      • 從新賦值:

        • global

        • nonlocal

    • 所有變量之後必須所有是大寫

      USER_LIST = [11,22,3]

      def func():
         name = 'asdf'
         USER_LIST.append(12)
         USER_LIST.append(name)

      func()
      print(USER_LIST)
相關文章
相關標籤/搜索