第四章 函數之高級函數

4.4 函數小高級

  1. 函數名做爲變量

    • 帶括號就執行函數,返回函數返回值;不加括號指向函數地址,函數不執行閉包

    • 函數能夠做爲字典的鍵值,能夠做爲鍵app

    # 典例一
    def func():
        print(123)    
    v1 = func   # func函數不執行
    func    # func函數不執行
    v1()    # 執行func函數
    # 典例二
    def func():
        print(123)    
    v1 = func() # func函數返回值
    func()  # 執行func函數
    print(v1)   # None
    def func():
        print(123)
        
    func_list = [func, func, func]  # func_list爲三個func函數地址
    func_list = [func(), func(), func()]    # [None, None, None]
    # func_list[0]()
    # func_list[1]()
    # func_list[2]()
    for item in func_list:
        v = item()  #123    循環3次
        print(v)    #None
    def func():
        print(123)
    ​
    def bar():
        print(666)
    ​
    info = {'k1': func, 'k2': bar}
    ​
    info['k1']()    # 執行函數func  123
    info['k2']()    # 執行函數bar   666
    def func():
        return 123
    ​
    func_list1 = [func,func,func]
    func_list2 = [func(),func(),func()]
    ​
    print(func_list1)   #func()函數地址 * 3
    print(func_list2)   # 123 123 123
    ​
    info = {
        'k1':func,
        'k2':func(),
    }
    print(info) # {'k1': <function func at 0x000001D5315DDA60>, 'k2': 123}
    View Code

     

  2. 函數能夠看成參數進行傳遞

    • 當參數時有(),獲得返回值;當參數時無(),獲得函數地址ide

    def func(arg):
        print(arg)
        
    func(1) # 執行func    1
    func([1,2,3,4]) # 執行func    [1,2,3,4]
    def show():
        return 999
    func(show)  # show不執行 指向函數地址
    func(show())    # show執行    999
    def func(arg):
        v1 = arg()#函數show執行 v1爲函數show返回值
        print(v1)
        
    def show():
        print(666)#輸出666
        
    func(show)#指向函數show地址不執行
    def func(arg):
        v1 = arg()
        print(v1)
        
    def show():
        print(666)
        
    result = func(show)#result爲函數func的返回值
    print(result)
    View Code

     

  3. 數據類型中的方法到底有沒有返回值?

    • 無返回值函數

      v = [11,22,33]
      v.append(99) # 無返回值
    • 僅有返回值:ui

      v = "alex"
      result = v.split('l')

      v = {'k1':'v2'}
      result1 = v.get('k1')
      result2 = v.keys()
    • 有返回+修改數據spa

      v = [11,22,33]
      result = v.pop()
    • 經常使用須要記住3d

      • str 字符串的全部方法基本上都是返回值爲新值code

        • strip,返回字符串blog

        • split,返回列表遞歸

        • replace,返回字符串

        • join,返回字符串。

      • list 列表全部方法基本上都是返回值None

        • append,無

        • insert,無

        • pop,返回要刪除的數據

        • remove,無

        • find/index,返回索引的位置。

      • dict

        • get ,返回指定鍵值

        • keys,返回全部鍵

        • values,返回全部值

        • items,返回全部鍵值對

  4. 函數內部的數據是否會混亂。

    • 函數內部執行相互之間不會混亂

    • 執行完畢 + 內部元素不被其餘人使用 => 銷燬

4.5 函數中高級

  1. 函數作返回值

    • 就找函數什麼時候被誰建立

    def func():
        print(123)  #輸出123
    def bar():
        return fun  #返回函數fun
    v = bar()   #執行函數bar()
    v() # 執行函數func()
    name = 'oldboy'
    def func():
        print(name)
    def bar():
        return func
    v = bar()
    v() # oldboy
    def bar():
        def inner():
            print(123)
        return inner
    v= bar() 
    v() # 123
    name = 'oldboy'
    def bar():
        name = 'alex'
        def inner():
            print(name)
        return inner
    v = bar()
    v() # alex
    name = 'oldboy'
    def bar(name):
        def inner():
            print(name)
        return inner
    v1 = bar('alex')
    v2 = bar('eric')
    v1()    # alex
    v2()    # eric
    # 示例一
    name = 'alex'
    def base():
        print(name)   
    def func():
        name = 'eric'
        base()
    func()  # alex
    # 示例二
    name = 'alex'
    def func():
        name = 'eric'
        def base():
            print(name)
        base()   
    func()  # eric
    # 示例三
    name = 'alex'
    def func():
        name = 'eric'
        def base():
            print(name)
        return base 
    base = func()
    base()  # eric
    View Code

  1. 閉包

    • 閉包概念:爲函數建立一塊區域併爲其維護本身數據,之後執行時方便調用。

    • 閉包應用場景:裝飾器、SQLAlchemy源碼

    • a函數裏面有b函數,而且返回值爲b函數(b函數只被調用,沒被執行;b函數引用a函數的變量)

       def func(name):
       def inner():
            print(name)
    return inner

       v1 = func('alex') # 執行func()函數值爲alex,返回inner
    v1() #執行inner()函數,輸出alex
    v2 = func('eric')
    v2()
  2. 高階函數

    • 把函數當作參數傳遞

    • 把函數當作返回值

    • 對函數進行復制

  3. 遞歸

    • 含義:函數本身調本身(效率低)

      def func():
         print(1)
         func()
         
      func()

      # 示例
      def func(i):
         print(i)
         func(i+1)
         
      func(1)   # 1,2,3---988報錯,死循環
    • 斐契那波數列(有限制)

      def func(a,b):
         # 1
         # 1
         # 2
         # 3
         # 5
         print(b)
         func(b,a+b)
         
      func(0,1)
    • 遞歸函數返回值

      # 示例一
      def func(a):
          if a == 5:
              return 100000
          result = func(a+1) + 10
          return result 
      ​
      v = func(1)
      print(v)    #  10040
      # 示例二
      def func(a):
          if a == 5:
              return 100000
          result = func(a+1) + 10
      ​
      v = func(1)
      ​
      name = 'alex'
      def func():
          def inner():
              print(name)
           return inner
      v =func()
      View Code

       

  4. 總結

    • 函數執行的流程分析(函數是由誰建立的)

      def base():
         return i

      def func(arg):
         def inner():
             return arg
         return inner

      base_list = [] # [base,base,]
      func_list = [] # [由第一次執行func函數的內存地址,內部arg=0 建立的inner函數,有arg=1的inner函數 ]
      for i in range(10): # i = 0 ,1
         base_list.append(base)
         func_list.append(func(i))
         
      # 1. base_list 和 func_list中分別保存的是什麼?
      """
      base_list中存儲都是base函數。
      func_list中存儲的是inner函數,特別要說的是每一個inner是在不一樣的地址建立。
      """
      # 2. 若是循環打印什麼?
      for item in base_list:
          v = item() # 執行base函數
          print(v) # 都是9
      for data in func_list:
          v = data()
          print(v) # 0 1 2 3 4 
      View Code
相關文章
相關標籤/搜索