久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    Python 最頻繁使用的4個函數:lambda、 map、filter 和 reduce

     和相品 2022-06-11 發布于北京

    Python 提供了非常多的庫和內置函數。有不同的方法可以執行相同的任務,而在 Python 中使用最為頻繁函數莫過于:lambda()、 map()、filter() 和 reduce() 函數,今天我將和大家一起研究學習,喜歡記得收藏、關注、點贊。

    【注】代碼、資料、交流文末獲取

    Lambda 函數簡介

    Lambda函數也被稱為匿名(沒有名稱)函數,它直接接受參數的數量以及使用該參數執行的條件或操作,該參數以冒號分隔,并返回最終結果。為了在大型代碼庫上編寫代碼時執行一項小任務,或者在函數中執行一項小任務,便在正常過程中使用lambda函數。

    lambda argument_list:expersion
    

    argument_list是參數列表,它的結構與Python中函數(function)的參數列表是一樣的

    a,b
    a=1,b=2
    *args
    **kwargs
    a,b=1,*args
    空
    ....
    

    expression是一個關于參數的表達式,表達式中出現的參數需要在argument_list中有定義,并且表達式只能是單行的。

    1
    None
    a+b
    sum(a)
    1 if a >10 else 0
    [i for i in range(10)]
    ...
    

    普通函數和Lambda函數的區別

    1. 沒有名稱
      Lambda函數沒有名稱,而普通操作有一個合適的名稱。

    2. Lambda函數沒有返回值
      使用def關鍵字構建的普通函數返回值或序列數據類型,但在Lambda函數中返回一個完整的過程。假設我們想要檢查數字是偶數還是奇數,使用lambda函數語法類似于下面的代碼片段。

    b = lambda x: "Even" if x%2==0 else "Odd"
    b(9)
    
    1. 函數只在一行中
      Lambda函數只在一行中編寫和創建,而在普通函數的中使用縮進

    2. 不用于代碼重用
      Lambda函數不能用于代碼重用,或者不能在任何其他文件中導入這個函數。相反,普通函數用于代碼重用,可以在外部文件中使用。

    為什么要使用Lambda函數?

    一般情況下,我們不使用Lambda函數,而是將其與高階函數一起使用。高階函數是一種需要多個函數來完成任務的函數,或者當一個函數返回任何另一個函數時,可以選擇使用Lambda函數。

    什么是高階函數?

    通過一個例子來理解高階函數。假設有一個整數列表,必須返回三個輸出。

    • 一個列表中所有偶數的和

    • 一個列表中所有奇數的和

    • 一個所有能被三整除的數的和

    首先假設用普通函數來處理這個問題。在這種情況下,將聲明三個不同的變量來存儲各個任務,并使用一個for循環處理并返回結果三個變量。該方法常規可正常運行。

    現在使用Lambda函數來解決這個問題,那么可以用三個不同的Lambda函數來檢查一個待檢驗數是否是偶數,奇數,還是能被三整除,然后在結果中加上一個數。

    def return_sum(func, lst):
      result = 0
      for i in lst:
        #if val satisfies func
        if func(i):
          result = result + i
      return result
    lst = [11,14,21,56,78,45,29,28]
    x = lambda a: a%2 == 0
    y = lambda a: a%2 != 0
    z = lambda a: a%3 == 0
    print(return_sum(x, lst))
    print(return_sum(y, lst))
    print(return_sum(z, lst))
    

    這里創建了一個高階函數,其中將Lambda函數作為一個部分傳遞給普通函數。其實這種類型的代碼在互聯網上隨處可見。然而很多人在使用Python時都會忽略這個函數,或者只是偶爾使用它,但其實這些函數真的非常方便,同時也可以節省更多的代碼行。接下來我們一起看看這些高階函數。

    Python內置高階函數

    Map函數

    map() 會根據提供的函數對指定序列做映射。

    Map函數是一個接受兩個參數的函數。第一個參數 function 以參數序列中的每一個元素調用 function 函數,第二個是任何可迭代的序列數據類型。返回包含每次 function 函數返回值的新列表。

    map(function, iterable, ...)
    

    Map函數將定義在迭代器對象中的某種類型的操作。假設我們要將數組元素進行平方運算,即將一個數組的每個元素的平方映射到另一個產生所需結果的數組。

    arr = [2,4,6,8] 
    arr = list(map(lambda x: x*x, arr)) 
    print(arr)
    

    我們可以以不同的方式使用Map函數。假設有一個包含名稱、地址等詳細信息的字典列表,目標是生成一個包含所有名稱的新列表。

    students = [
                {"name": "John Doe",
                 "father name": "Robert Doe",
                 "Address": "123 Hall street"
                 },
                {
                  "name": "Rahul Garg",
                  "father name": "Kamal Garg",
                  "Address": "3-Upper-Street corner"
                },
                {
                  "name": "Angela Steven",
                 "father name": "Jabob steven",
                 "Address": "Unknown"
                }
    ]
    print(list(map(lambda student: student['name'], students)))
    >>> ['John Doe', 'Rahul Garg', 'Angela Steven']
    

    上述操作通常出現在從數據庫或網絡抓取獲取數據等場景中。

    Filter函數

    Filter函數根據給定的特定條件過濾掉數據。即在函數中設定過濾條件,迭代元素,保留返回值為True 的元素。Map 函數對每個元素進行操作,而 filter 函數僅輸出滿足特定要求的元素。

    假設有一個水果名稱列表,任務是只輸出那些名稱中包含字符“g”的名稱。

    fruits = ['mango', 'apple', 'orange', 'cherry', 'grapes'] 
    print(list(filter(lambda fruit: 'g' in fruit, fruits)))
    

    filter(function or None, iterable) --> filter object

    返回一個迭代器,為那些函數或項為真的可迭代項。如果函數為None,則返回為真的項。

    Reduce函數

    這個函數比較特別,不是 Python 的內置函數,需要通過from functools import reduce 導入。Reduce 從序列數據結構返回單個輸出值,它通過應用一個給定的函數來減少元素。

    reduce(function, sequence[, initial]) -> value
    

    將包含兩個參數的函數(function)累計應用于序列(sequence)的項,從左到右,從而將序列reduce至單個值。

    如果存在initial,則將其放在項目之前的序列,并作為默認值時序列是空的。

    假設有一個整數列表,并求得所有元素的總和。且使用reduce函數而不是使用for循環來處理此問題。

    from functools import reduce
    lst = [2,4,6,8,10]
    print(reduce(lambda x, y: x+y, lst))
    >>> 30
    

    還可以使用 reduce 函數而不是for循環從列表中找到最大或最小的元素。

    lst = [2,4,6,8]
    # 找到最大元素
    print(reduce(lambda x, y: x if x>y else y, lst))
    # 找到最小元素
    print(reduce(lambda x, y: x if x<y else y, lst))
    

    高階函數的替代方法

    列表推導式

    其實列表推導式只是一個for循環,用于添加新列表中的每一項,以從現有索引或一組元素創建一個新列表。之前使用map、filter和reduce完成的工作也可以使用列表推導式完成。然而,相比于使用Map和filter函數,很多人更喜歡使用列表推導式,也許是因為它更容易應用和記憶。

    同樣使用列表推導式將數組中每個元素進行平方運算,水果的例子也可以使用列表推導式來解決。

    arr = [2,4,6,8]
    arr = [i**2 for i in arr]
    print(arr)
    fruit_result = [fruit for fruit in fruits if 'g' in fruit]
    print(fruit_result)
    

    字典推導式

    與列表推導式一樣,使用字典推導式從現有的字典創建一個新字典。還可以從列表創建字典。

    假設有一個整數列表,需要創建一個字典,其中鍵是列表中的每個元素,值是列表中的每個元素的平方。

    lst = [2,4,6,8]
    D1 = {item:item**2 for item in lst}
    print(D1)
    >>> {2: 4, 4: 16, 6: 36, 8: 64}
    # 創建一個只包含奇數元素的字典
    arr = [1,2,3,4,5,6,7,8]
    D2 = {item: item**2 for item in arr if item %2 != 0}
    print(D2)
    >>> {1: 1, 3: 9, 5: 25, 7: 49}
    

    一個簡單應用

    如何快速找到多個字典的公共鍵

    方法一

    dl = [d1, d2, d3] # d1, d2, d3為字典,目標找到所有字典的公共鍵
    [k for k in dl[0] if all(map(lambda d: k in d, dl[1:]))]
    
    dl = [{1:'life', 2: 'is'}, 
          {1:'short', 3: 'i'}, 
          {1: 'use', 4: 'python'}]
    [k for k in dl[0] if all(map(lambda d: k in d, dl[1:]))]
    # 1
    
    解析
    # 列表表達式遍歷dl中第一個字典中的鍵
    [k for k in dl[0]]
    # [1, 2]
    
    # lambda 匿名函數判斷字典中的鍵,即k值是否在其余字典中
    list(map(lambda d: 1 in d, dl[1:]))
    # [True, True]
    list(map(lambda d: 2 in d, dl[1:]))
    #[False, False]
    
    # 列表表達式條件為上述結果([True, True])全為True,則輸出對應的k值
    #1
    

    方法二

    # 利用集合(set)的交集操作
    from functools import reduce
    # reduce(lambda a, b: a*b, range(1,11)) # 10!
    reduce(lambda a, b: a & b, map(dict.keys, dl))
    

    寫在最后

    目前已經學習了Lambda函數是什么,以及Lambda函數的一些使用方法。隨后又一起學習了Python中的高階函數,以及如何在高階函數中使用lambda函數。除此之外,還學習了高階函數的替代方法:在列表推導式和字典推導式中執行之前操作。雖然這些方法看似簡單,或者說你之前已經見到過這類方法,但你很可能很少使用它們。你可以嘗試在其他更加復雜的函數中使用它們,以便使代碼更加簡潔。

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 在线观看AV永久免费| 一級特黃色毛片免費看| 亚洲精品成人福利网站| 12裸体自慰免费观看网站| 又黄又爽又无遮挡免费的网站| 国产AV影片麻豆精品传媒| 国产精品毛片无遮挡高清| 亚洲人妻精品一区二区| 国产高潮刺激叫喊视频| 国产日韩精品中文字幕| 国产免费1卡2卡| 午夜高清福利在线观看| 精品无码久久久久国产| 国产精品亚洲二区亚瑟| 久久综合精品国产二区无码| 中文字幕亚洲人妻一区| 国产男女性潮高清免费网站| 97欧美精品系列一区二区| 久久午夜无码鲁丝片| 国产精品丝袜亚洲熟女| 下面一进一出好爽视频| 久久精品毛片免费观看| 国产一区二区波多野结衣| 99久久无色码中文字幕| 亚洲欧美日韩愉拍自拍美利坚| 亚洲熟妇无码一区二区三区 | 日本一区二区三区免费播放视频站| 亚洲AV无码一区二区三区在线播放| 国产精品一区在线蜜臀| 亚洲AV无码成人精品区蜜桃| 精品无码日韩国产不卡AV| 国产成人综合色就色综合| 无码国产精品一区二区免费式芒果 | 欧美性XXXX极品HD欧美风情| 国产成人精品亚洲资源| 18禁裸体动漫美女无遮挡网站| 亚洲最大的熟女水蜜桃AV网站| 人妻中文字幕不卡精品| 国产精品无码无卡在线播放| 久久精品国产免费观看三人同眠| 国产永久免费高清在线观看|