1. 程式人生 > >07-函數使用(01)

07-函數使用(01)

支持 無法 一個 sin 返回 rgs -s 定義 instance

#函數使用

零碎知識

  • 靈活的if-else

    a = 3 if False else 5
    # 等價於
    if False:
        a = 3
    else:
        a = 5

  • 靈活的and/or

    # 當前面為真,才會進行後面的運算
    b = True and 3
    # 當前面為假,後面就不會運算了
    # b = False and 3
    
    # 當前面的值為真,後面就不需要了
    # a = True or 5
    # 當前面的值為假,才會進行後面的運算
    a = False or 5

  • 類型的判斷

    a = 10
    # if type(a) == int:
    if type(a) == type(1):
        
    print(a, 是整數) # 判斷一個對象是否是一個類的實例(對象) # 是返回True,不是返回False print(isinstance(a, int)) print(isinstance(a, float)) # 判斷一個對象能否調用 print(callable(test))

匿名函數

  • 函數可以像普通變量一樣進行賦值

    def hello():
        print(Hello world)
    
    # __name__是函數的名字
    print(hello.__name__)
    
    # 可以像普通變量一樣進行賦值
    a = hello
    
    print(a.__name__
    ) hello() a()

  • 函數可以作為另一個函數的參數進行傳遞

    def add(a, b):
        return a + b
    
    # 將函數作為參數
    # 可以使函數的功能更加靈活多變
    def calc(a, b, func):
        return func(a, b)
    
    print(calc(3, 5, add))

  • 匿名函數的出現

    • 將函數作為參數時,若函數只使用一次,沒有必要單獨定義,然後再傳遞
    • 定義匿名函數需要使用關鍵字
      lambda

    • 定義格式:
      lambda 參數列表:表達式

      • lambda開頭
      • 後面跟需要的參數,多個參數使用逗號隔開
      • 最後一個參數後跟上‘:‘
      • 冒號後跟上表達式,這個表達式就是返回值,不需要使用return
    • 示例1:
    # 不需要先定義,然後再使用
    print(calc(5, 2, lambda a,b: a - b))

    • 示例2:
    lt = [
        {name: xiaodu, age: 20, height: 170},
        {name: xiaomin, age: 22, height: 167},
        {name: xiaowang, age: 18, height: 160},
        {name: xiaoma, age: 25, height: 180},
    ]
    
    def key(d):
        return d[age]
    
    # lt.sort(key=key)
    # 使用匿名函數
    lt.sort(key=lambda d: d[height])
    for i in lt:
        print(i)

    • 練習:實現列表的sort方法,要求可以指定key,可以逆序

閉包

  • 定義:

    • 外部函數中定義一個內部函數
    • 內部函數中使用外部函數的局部變量
    • 外部函數將內部函數作為返回值返回
    • 此時的內部函數就叫閉包
  • 示例:

    def wai(n):
        def nei():
            return n * n
        return nei
    
    f1 = wai(3)
    f2 = wai(2)
    
    print(f1())
    print(f2())
    
    def wai(*args):
        def nei():
            ret = 0
            for i in args:
                ret += i
            return ret
          return nei  
    
    f1 = wai(1, 2, 3)
    print(f1())  

裝飾器

  • 作用:當我們想要增加原有函數的功能,但是不想(或無法)改變原來的函數,可以通過裝飾器來實現

  • 使用:

    • 首先定義一個裝飾器函數,該函數接受一個函數作為參數,然後返回一個閉包
    • 在閉包中調用傳遞進來的函數,並且前後可以根據需要進行修飾
  • 示例:

    def zhuangshiqi(func):
        def wrapper():
            print(前面裝飾)
            func()
            print(後面裝飾)
        return wrapper
    
    @zhuangshiqi    # 等價於test = zhuangshiqi(test)
    def test():
        print(hello)
    
    test() 

  • 裝飾器運用

    • 裝飾無參無返回值的函數
    • 裝飾帶參無返回值的函數
    • 裝飾帶參有返回值的函數

練習:(實踐拓展是練手的最好方法)

  • 實現列表的排序函數,要求支持逆序和指定排序標準(key)

  • 計算一個字符串中所有數字的和

  • 實現一個字符串的逆序函數

  • 返回一個列表中出現次數最多的元素

07-函數使用(01)