1. 程式人生 > 實用技巧 >Day 10 函式形參: 萬能引數:引數順序:僅限關鍵字引數:名稱空間:載入取值順序:函式巢狀

Day 10 函式形參: 萬能引數:引數順序:僅限關鍵字引數:名稱空間:載入取值順序:函式巢狀

1 今日內容大綱

  • 學習方法:
    • 安裝環境
    • 專案需求提問
    • 自學能力,獨立解決問題
  • 形參角度:
    • 萬能引數
    • *的魔性用法
    • 僅限關鍵字引數(瞭解為主)
    • 形參的最終順序
  • 名稱空間
    • 全域性名稱空間,區域性.....
    • 載入順序,取值順序.
    • 作用域
  • 函式的巢狀(高階函式)
  • 內建函式:globals locals
  • 關鍵字:nonlocal,global

2 昨日內容回顧作業講解

  1. 函式以功能為導向,減少重複程式碼,提高程式碼的可讀性

    def func():
    	函式體
    
    • 函式的呼叫

      func()
      func()
      func()	
      
      
    • 函式返回值:

      • return
        • 終止函式
        • return單個值 ----- 單個值
        • return多個值 ------ 元組
    • 函式的引數:

      • 實參角度:位置引數,關鍵字引數,混合引數
      • 形參角度:位置引數,預設引數

3 今日內容

  1. 如何在工作中不讓別人看出你是培訓出來的?

    1. 第一天安裝環境等,小白各種問
    2. 專案需求不清晰,也不敢問
    3. 六個月內學會自主學習,自己解決問題
  2. 形參角度:

    • 萬能引數

    • *的魔性用法

      # 形參角度
      # 萬能引數
      def eat(a,b,c,d):
          print('我請你吃:%s,%s,%s,%s'%(a,b,c,d))
      
      eat('蒸羊羔','蒸熊掌','燒花鴨','燒子鵝')
      
      def eat(a,b,c,d,e,f):     #寫死了
          print('我請你吃:%s,%s,%s,%s,%s,%s'%(a,b,c,d,e,f))
      
      eat('蒸羊羔', '蒸熊掌', '蒸鹿邑','燒花鴨','燒雛雞','燒子鵝')
      
      
      # 急需要一種形參,可以接受所有的實參
      # 萬能引數: *args,約定俗成
      # 函式定義時,*代表聚合.他將所有的位置引數,聚合成一個元組,賦值給args
      def eat(*args):
          print(args)#('蒸羊羔', '蒸熊掌', '蒸鹿邑', '燒花鴨', '燒雛雞', '燒子鵝')
          print('我請你吃:%s,%s,%s,%s,%s,%s'% args)
      
      eat('蒸羊羔', '蒸熊掌', '蒸鹿邑','燒花鴨','燒雛雞','燒子鵝')
      
      
      # 寫一個函式:計算你傳入函式的所有的數字的和
      def func(*args):
          s = 0
          for i in args:
              s += i
          return s
      
      print(func(1,2,3,4,5))
      
      # **kwargs
      # 函式的定義時: **將 所有的關鍵字引數聚合到一個字典中,將這個字典賦值給了kwargs!!!!!!!!!!!
      def func(**kwargs):
          print(kwargs)
      
      func(name='alex',age='29',sex='boy')#{'name': 'alex', 'age': '29', 'sex': 'boy'}
      
      # 萬能引數:*args,**kwargs,
      def func(*args,**kwargs):
          print(args)#()
          print(kwargs)#{}
      
      func()
      
      # 在函式的呼叫時,*代表打散
      def func(*args,**kwargs):
          print(args) #(1, 2, 3, 11, 22, 33, 44)
          print(kwargs) #{}
      # func(*[1,2,3],*[11,22,33,44])
      # func(*'laskfjka',*'lklkla') #('l', 'a', 's', 'k', 'f', 'j', 'k', 'a', 'l', 'k', 'l', 'k', 'l', 'a') 相當於輸入單個元素
      func(**{'name':'alex'},**{'age':'29'})  #{'name': 'alex', 'age': '29'} 相當於輸入鍵值對
      
    • 形參的最終順序(瞭解僅限關鍵字引數):

      # 形參角度的引數順序:
      # *args 的位置?
      def func(*args,a,b,sex = '男'):
          print(a,b)
      func(1,2,3,4)   #func() missing 2 required keyword-only arguments: 'a' and 'b' ###報錯!!1
      
      # args得到實參的前提,sex必須被覆蓋
      def func(a,b,sex = '男',*args):
          print(a,b)  #1 2
          print(sex)  #3
          print(args) #(4, 5, 6, 7, 8, 9)
      func(1,2,3,4,5,6,7,8,9)
      
      def func(a,b,*args,sex = '男'):
          print(a,b)  #1 2
          print(args) #(3, 4, 5, 6, 7, 8, 9)
          print(sex)  #女
      func(1,2,3,4,5,6,7,8,9,sex='女')
      
      # **kwargs 的位置?
      def func(a,b,*args,sex ='男',**kwargs):
          print(a,b)  # 1 2
          print(args) # (3, 4, 5, 6, 7, 8)
          print(sex)  # 女
          print(kwargs)   # {'name': 'alex', 'age': '29', 'edu': '小學'}
      func(1,2,3,4,5,6,7,8,sex='女',name='alex',age='29',edu= '小學')
      
      #形參角度的第四個引數:僅限關鍵字引數(瞭解)
      def func(a,b,*args,sex = '男',c,**kwargs):
          print(a, b) #1 2
          print(args) #(3, 4, 5, 6, 7, 8)
          print(sex)  #女
          print(c)    #6666666666    #僅限關鍵字引數!!!!
          print(kwargs)   #{'name': 'alex', 'age': '19', 'edu': '小學'}
      func(1,2,3,4,5,6,7,8,sex='女',name='alex',age='19',edu='小學',c='6666666666')
      func(1,2,3,4,5,6,7,8,sex='女',name='alex',age='19',c='6666666666',edu='小學')#結果一致
      
      #形參角度的最終順序: 位置引數 ,  *args  ,  預設引數  ,  僅限關鍵字引數  ,  **kwargs
      
  3. 名稱空間(示意圖見Day 10.pdf)

    1. 全域性名稱空間
    2. 區域性名稱空間
    3. 內建名稱空間
    # 名稱空間:名稱空間
    
    a = 1
    b = 2
    def func():
        f = 5
        print(f)
    c = 3
    func()    # 5
    
    #內建名稱空間:python原始碼給你提供了一些內建的函式:print,input
    # print(666)
    # python分為三個空間:
        #內建名稱空間(builtins.py)
        #全域性名稱空間(當前py檔案)
        #區域性名稱空間(函式,函式執行時才開闢,函式結束執行,空間消失)
    
    # 載入順序:
    # 內建名稱空間---->全域性名稱空間------->區域性名稱空間(函式執行時)
    def func():
        pass
    func()
    a = 5
    print(666)
    
    # 取值順序(就近原則)並且單項不可逆
    # LEGB 原則
    input = '太白金星'
    def func():
        input = 'alex'
        print(input)
    func()  #alex
    #(從區域性找時)區域性名稱空間 ----> 全域性名稱空間 ----> 內建名稱空間
    #(從全域性找時)全域性名稱空間 ----> 內建名稱空間
    
  4. 作用域

    # 作用域:
    #   兩個作用域:
    #       1.全域性作用域:內建名稱空間 + 全域性名稱空間
    #       2.區域性作用域:區域性名稱空間
    
    # # 區域性作用域 可以引用 全域性作用域的變數
    data = '週五'
    def func():
        a = 666
        print(data)
    # print(a)
    func()
    # print(a)
    
    # 區域性變數不能改變全域性變數.
    count = 1
    def func():
        count += 2
        print(count)
    func()              #UnboundLocalError: local variable 'count' referenced before assignment
    # 區域性作用域不能改變全域性作用域的變數.  因為  當python直譯器讀取到區域性作用域時,發現了你對一個變數進行修改的操作,
    # 直譯器會認為你在區域性已經定義過這個區域性變量了,他就會從區域性找這和變數,就會報錯
    
    # 使用可以,帶不能改變
    def func():
        count = 1
        def inner():
            print(count)
        inner()
    func()
    
    def func():
        count = 1
        def inner():
            count += 1
            print(count)    #報錯
        inner()
    func()
    
  5. 函式的巢狀(高階函式)(圖解見pdf):

    # 例1
    def func1():
        print('in func1')
        print(3)
    
    def func2():
        print('in func2')
        print(4)
    
    func1()
    print(1)
    func2()
    print(2)
    # in func1,3,1,in func2,4,2
    
    
    # 例2:
    def func1():
        print('in func1')
        print(3)
    
    def func2():
        print('in func2')
        func1()
        print(4)
    
    print(1)
    func2()
    print(2)
    # 1,in func2,in func1,3,4,2
    
    # 例3:
    def fun2():
        print(2)
    
        def fun3():
            print(6)
    
        print(4)
        fun3()
        print(8)
    
    print(3)
    fun2()
    print(5)
    # 3,2,4,6,8,5
    
  6. 內建函式 globals locals

    '''
    本檔案:研究內建函式:globals locals
    '''
    a = 1
    b = 2
    def func():
        name = 'alex'
        age = 73
        sex = 'boy'
        print(globals()) # 返回的是字典:字典裡面的鍵值對:全域性作用域的所有內容。
        print(locals())# 返回的是字典:字典裡面的鍵值對:當前作用域的所有的內容。
    func()
    print(globals()) # 返回的是字典:字典裡面的鍵值對:全域性作用域的所有內容。
    print(locals())# 返回的是字典:字典裡面的鍵值對:當前作用域的所有的內容。
    
    
  7. 關鍵字nonlocal global.

4 今日總結

  1. 引數:
    1. 形參角度:
      • 萬能引數
      • 僅限關鍵字引數(瞭解)
      • 引數的順序
      • *的魔性用法:聚合,打散
  2. 名稱空間,作用域,取值順序,載入順序
  3. globals(),locals()
  4. 高階函式執行順序

5 下週預習內容

  1. 函式名的運用,迭代器
  2. 生成器