<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Pyhton-Lambda表達式

      什么是lambda表達式

      lambda 表達式是一個匿名函數,lambda表達式基于數學中的λ演算得名,直接對應于其中的lambda抽象,是一個匿名函數,即沒有函數名的函數。

      lambda表達式常用來聲明匿名函數,即沒有函數名字的臨時使用的小函數,常用在臨時需要一個類似于函數的功能但又不想定義函數的場合。它只可以包含一個表達式,不允許包含其他復雜的語句,但在表達式中可以調用其他函數,該表達式的計算結果相當于函數的返回結果。

      lambda表達式可以接受任意數量的參數,但函數只能包含一個表達式。表達式是lambda函數執行的一段段代碼,它可以返回任何值,返回函數對象。

      在Python中,lambda的語法是唯一的。其形式如下:

      lambda  argument_list: expression

      其中,lambda是Python預留的關鍵字,argument_list(參數列表)和expression(表達式)由用戶自定義。

       

      基本特性

      lambda函數有如下特性:

      (1)、lambda函數是匿名的:所謂匿名函數,通俗地說就是沒有名字的函數。lambda函數返回的函數對象是沒有名字的,需要在lambda表達式外賦予名字。

      (2)、lambda函數有輸入和輸出:輸入是傳入到參數列表argument_list的值,輸出是根據表達式expression計算得到的值。

      (3)、lambda函數一般功能簡單:單行expression決定了lambda函數不可能完成太過復雜的邏輯,只能完成較為簡單的功能。由于其實現的功能一目了然,甚至不需要專門的名字來說明。

       

      下面是一些lambda表達式的基本用法示例:

      lambda x,y: x*y      # 函數輸入是x和y,輸出是它們的積x*y
      lambda x,y=2: x*y    # lambda表達式也支持設定參數默認值
      lambda: "CDA data analysis"   # 函數沒有輸入參數,輸出是設定的字符串
      lambda *args: sum(args)     # 輸入是任意個數的參數,輸出是它們的和(輸入參數必須能夠進行加法運算)
      lambda **kwargs: 1          # 輸入是任意鍵值對參數,輸出是1

       

      使用方法

      lambda表達式返回的是一個函數對象,其本質上只有一種用法,那就是定義一個lambda匿名函數。在實際中,根據這個lambda函數應用場景的不同,lambda函數的用法有很多種,其中一種就是將lambda函數作為參數傳遞給其他函數。

      Python有少數內置函數可以接收lambda函數作為參數,進行組合使用,這也是最為常見的一種用法。

      典型的此類內置函數有這四種:

      (1)filter函數:根據提供的函數對可迭代對象進行篩選,返回一個包含所有使函數返回True的元素的迭代器。

      (2)map函數:將一個函數應用于可迭代對象的每個元素,并返回一個包含結果的迭代器。

      (3)sorted函數:對列表中所有元素進行排序,lambda函數可以用于指定排序規則。

      (4)reduce函數:將一個函數應用于可迭代對象的累積結果,逐步減少數據集的大小,最終返回單一結果。列表中兩兩相鄰元素逐一進行運算,lambda函數用于指定運算條件。

      from functools import reduce
      
      list_x = [1,2,3,4,5]
      
      filter(lambda x: x % 3 == 0, list_x)   # filter函數
      sorted(list_x, key=lambda x:(10-x))    # sorted函數
      map(lambda x:x+1, list_x)              # map函數
      reduce(lambda x, y: x+y, [1,2,3,4,5])  # reduce函數

       

      一、filter函數

      filter( )函數用于過濾序列,過濾掉不符合條件的元素,返回一個迭代器對象,注意返回的不是列表,如果要轉換為列表,可以使用 list()來轉換。

      該函數接收兩個參數,第一個為函數,第二個為序列,filter函數的重點在于過濾,所以它必須有一個用于判斷的工具,這就是function參數的函數,傳入的函數返回值必須是布爾類型,序列的每個元素作為參數逐個傳遞給函數進行判斷,然后返回 True 或 False,最后將返回 True 的元素放到新列表中。

      # 語法: filter(function, iterable)

      # 參數function:

      # 判斷函數iterable:可迭代對象,例如列表、元組、字符串等

      # 返回返回一個迭代器對象

       

      簡單示例一:

      # 找出1-10之間的偶數

      list(filter(lambda x: x%2 == 0,range(1,11)))

      # output[2, 4, 6, 8, 10]

       

      簡單示例二:

      # 刪除空字符

      list(filter(lambda x:x.strip(), ['cda', '', '\t', 'cc', ' ','\n']))

      # output['cda', 'cc']

       

      簡單示例三:

      # 求水仙花數

      list(filter(lambda x:x == (x//100)**3 + (x//10%10)**3 + (x%10)**3,range(100,1000)))

      # output[153, 370, 371, 407]

       

      二、map函數

      map( )會根據提供的函數對指定序列做映射,即根據傳入的函數逐一對序列中的元素進行計算。

      該函數至少接收兩個參數,第一個參數為函數function,第二個參數為可迭代對象iterable,第二個參數序列中的每一個元素調用第一個參數 function函數來進行計算,返回包含每次 function 函數返回值的可迭代對象,map( )函數和filter( )函數一樣,在python3版本中返回的都是可迭代對象,有需要的話用list( )函數將其轉換成列表格式。

      # 語法:map(function, iterable, ...)

      # 參數function:

      # 判斷函數iterable:一個或多個序列、可迭代對象,例如列表、元組、字符串等

      # 返回返回一個迭代器對象

       

      簡單示例一:

      # 計算列表各個元素的平方

      list(map(lambda x:x ** 2, [1,2,3,4,5]))  

      # output[1, 4, 9, 16, 25]

       

      簡單示例二:

      # 將文本轉換為小寫

      str_list = ["Alan","CDA","ccongg"]list(map(lambda x:x.lower(),str_list))

      # output['alan', 'cda', 'ccongg']

       

      map( )函數可以僅對一個序列進行運算,也可以輸入多個序列進行并行運算,對多個序列同一位置的元素來逐步進行運算。序列不要求長度必須相同,最后返回的結果遵循木桶準則,以多個序列中長度最短的長度為準,即傳入一個長度為4的序列,一個長度為7的序列,最終返回的序列長度為4。

       

      簡單示例三:

      # 提供了兩個列表,對相同位置的列表數據進行運算,計算向量的模

      import math
      
      x_list = [-2,-4,4,2]
      y_list = [1,3,-3,-1]
      list(map(lambda x, y: math.sqrt(x**2 + y**2),x_list,y_list))

      # output[2.23606797749979, 5.0, 5.0, 2.23606797749979]

       

      三、sorted函數

      sorted( ) 函數的作用是對所有可迭代的對象進行排序操作。它和sort函數的作用類似,但它們之間還是有一些區別:

      sort 是應用在 list 上的方法,sorted 可以對所有可迭代的對象進行排序操作。list 的 sort 方法返回的是對已經存在的列表進行操作,無返回值,而內置函數 sorted 方法返回的是一個新的 list,而不是在原來的基礎上進行的操作。

      sort( )和sorted( )函數的區別:

      a = [5,7,6,3,4,1,2]   # 定義列表
      b = (5,7,6,3,4,1,2)   # 定義元組
      
      a.sort()      # sort用以列表的排序,無法用于元組之類的可迭代對象
      sorted(b)    # sorted對元組b進行排序
      b              # 查看b是否發生變化
      b.sort()       # 對元組使用sort排序

      執行結果:

      out1: [1, 2, 3, 4, 5, 6, 7]  # sort()對a列表排序后,a本身發生改變

      out2: [1, 2, 3, 4, 5, 6, 7]  # sorted()對b元組進行排序,返回的是列表格式

      out3: (5,7,6,3,4,1,2)     # 可以看出,b本身沒有發生變化

      out4:AttributeError: 'tuple' object has no attribute 'sort'  # 元組無法使用sort()函數

       

      # 語法:sorted(iterable, key=None, reverse=False)

      # 參數說明:

      # iterable:可迭代對象。

      # key:主要是用來進行比較的元素,只有一個參數,具體的函數的參數就是取自于可迭代對象中,指定可迭代對象中的一個元素來進行排序。具體使用中通常以lambda匿名函數作為key參數的傳入,用以指定用以排序的對象。

      # reverse:排序規則,reverse為逆序的意思,當reverse = True表示降序 , reverse = False表示升序。默認為升序。

      # 返回:重新排序后的列表,無論用什么可迭代對象進行排序,最終返回的都是列表。

       

      簡單示例一:

      一維的序列無需key參數,只需要可迭代對象和reverse排序規則即可,注意,第一個參數可以默認為iterable可迭代對象,不可更改順序,后兩個可選參數傳入函數時,必須包含變量名稱,例如

      a = [5,7,6,3,4,1,2]
      
      sorted(a,reverse=True)           # 降序,正常執行
      sorted(reverse=True,city_rank)    # SyntaxError: 序列必須在第一個位置
      sorted(a,True)                  # TypeError: 沒有變量名的定義,必須為reverse=True

      # output 1:[7, 6, 5, 4, 3, 2, 1]

      # output 2:SyntaxError: positional argument follows keyword argument

      # output 3:TypeError: sorted expected 1 arguments, got 2

       

      簡單示例二:

      二維及以上的序列可以使用key參數傳入lambda匿名函數結合使用,實現按條件排序的作用,lambda函數的左右主要是用來指定用以排序的目標。

      city_rank=[('北京',1),('廣州',3),('深圳',4),('上海',2)]
      
      sorted(city_rank,key = lambda x:x[1])                  # 利用key
      sorted(city_rank,key = lambda x:x[1], reverse=True)    # 降序

      執行結果:

      [('北京', 1), ('上海', 2), ('廣州', 3), ('深圳', 4)]

      [('深圳', 4), ('廣州', 3), ('上海', 2), ('北京', 1)]

       

      四、reduce函數

      reduce() 函數在 python 2 是內置函數, 從python 3 開始移到了 functools 模塊。所以在使用前需要先導入,否則無法直接使用。

      reduce函數的功能是,從左到右對一個序列的項逐個地應用一個有兩個參數的函數,用函數的功能對序列的項逐個的進行運算,最終返回所使用的函數的結果。

      # 語法:
      #  from functools import reduce
      #  reduce(function, iterablel, initializer])
      # 參數說明:
      # function --函數,即有兩個符合序列數據類型運算參數的函數,可以是lambda匿名函數。(該函數有兩個參數,返回一個值)
      # iterable --可迭代對象,比如:列表、元組、字典、字符串等。reduce從這個對象的第一個元素開始,以此取出元素進行計算。
      # initializer --可選,初始值,用于第一次調用 function 時,如果提供初始值,reduce 會用這個值作為第一次調用 function的第一個參數,而可迭代對象的第一個元素作為第二個參數。如果未提供,iterable 的第一個元素會被用作初始值,并且function 的第一次調用會跳過第一個元素,從第二個元素開始。

       

      reduce的工作過程是 :在迭代sequence(tuple ,list ,dictionary, string等可迭代對象)的過程中,首先把前兩個元素傳給函數參數,函數加工后,然后把得到的結果和第三個元素作為兩個參數傳給函數參數, 函數加工后得到的結果又和第四個元素作為兩個參數函數參數,依次類推。如果傳入了initial值,那么首先傳的就不是 sequence的第一個和第二個元素,而是initial值和第一個元素。經過這樣的累計計算之后合并序列到一個單一返回值。

       

      例如:對列表中的元素進行累積求和。

      from functools import reduce                # 導入reduce函數
      
      reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])   # 計算的就是((((1+2)+3)+4)+5),返回結果15 

       

      將前面的例子中的加號改為乘號,實際上就從求和的函數變為求階乘的函數:

      from functools import reduce                # 導入reduce函數
      
      reduce(lambda x, y: x*y, [1, 2, 3, 4, 5])    # 計算的就是((((1*2)*3)*4)*5),返回結果120

       

      我們再玩一些稍微復雜一些的用法,只是簡單基本的用法介紹,對新手來說,理解肯定是不夠的,所以下面講點更深入的例子,以元組、字典類型的數據序列為目標來進行操作,我們的目標是計算元組中每一個元素中對應的薪資(wage)的平均數:

      from functools import reduce    # 導入reduce函數
      
      cda = ({'name':'cda01','wage':10500,"education":"BA"}, 
          {'name':'cda14','wage':15000,"education":"master"},
          {'name':'cda67','wage':12000,"education":"BA"},
          {'name':'cda96','wage':8000,"education":"BA"},
          {'name':'cda127','wage':11000,"education":"BA"},
          {'name':'cda141','wage':18000,"education":"master"}) red = lambda x,y: x + y["wage"] # 建立lambda函數,用以計算數據中wage的總和,注意x,y的不同之處 total_wage = reduce(red,cda,0) # 使用reduce函數,設置初始值為0, avg_wage = total_wage/len(cda) # 計算平均值 print(avg_wage)

      # output12416.666666666666

       

      也能用它實現分組:

      from functools import reduce
      
      cda = ({'name':'cda01','wage':10500,"education":"BA"}, 
          {'name':'cda14','wage':15000,"education":"master"},
          {'name':'cda67','wage':12000,"education":"BA"},
          {'name':'cda96','wage':8000,"education":"BA"},
          {'name':'cda127','wage':11000,"education":"BA"},
          {'name':'cda141','wage':18000,"education":"master"}) def group_by_edu(accumulator,value): accumulator[value['education']].append(value['name']) return accumulator grouped = reduce(group_by_edu, cda, {'master':[], 'BA':[]}) # 初始值是實現目標的最重要的點 print(grouped)

      # output {'master': ['cda14', 'cda141'], 'BA': ['cda01', 'cda67', 'cda96', 'cda127']}

      通過以上兩個案例可以看出,簡單加減示例中很少出現的初始值參數initial恰恰是實現復雜目標的最重要的點,它可以說是整個實現過程中的地基,是塑造最終結果的骨骼。

      更復雜的操作就沒必要使用reduce+lambdal了,可以使用一些其他的函數或者自定義來進行處理。

       

      總結

      以上四種就是能和lambda函數結合一起使用的函數,除了reduce函數在python3中移到了 functools 模塊。需要先導入模塊才能使用,其他三種都是python的內置函數,可以直接使用。它們之中有一些相同點和不同點,通過總結后更方便區分和以后的使用。

      相同點:

      (1)、都是用以處理可迭代對象;

      (2)、都可以配合lambda匿名函數進行使用;

      不同點:

      (1)、功能不同,lambda函數的作用不同

      filter函數:篩選列表中所有滿足條件的元素,lambda函數作為過濾列表元素的條件。關鍵詞:篩選

      map函數:根據提供的函數對指定序列做映射,lambda函數作為映射。關鍵詞:映射

      sorted函數:對列表中所有元素進行排序,lambda函數可以用于指定排序規則。關鍵詞:排序

      reduce函數:列表中兩兩相鄰元素逐一進行運算,lambda函數用于指定運算條件。關鍵詞:元素間運算

      (2)、reduce函數不是內置函數

      (3)、參數個數不同、序列和函數的傳入順序要求不同

      記住不同函數的功能,最好的方法就是函數名,filter的意思為過濾器、過濾;map有提供信息(尤指其編排或組織方式)的意思,sorted則是排序,整理的意思,reduce為減少,縮小的意思。如此一看,就能很深刻的記住這幾種函數的作用和用法了。

       

      posted @ 2025-03-11 11:16  業余磚家  閱讀(231)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 丰满人妻熟妇乱又仑精品| 怡红院一区二区三区在线| 中文字幕永久精品国产| 一区二区三区精品视频免费播放 | 兴仁县| 麻豆天美东精91厂制片| 宁津县| 国产免费高清69式视频在线观看| 久久香蕉国产线看观看怡红院妓院 | 日韩精品亚洲国产成人av| 国产女高清在线看免费观看| 国产成人综合在线观看不卡| 成年女人午夜毛片免费视频| 99亚洲男女激情在线观看| 国产情侣激情在线对白| 人妻人人做人做人人爱| 不卡一区二区三区四区视频| 无码专区视频精品老司机| 亚洲精品无码av人在线观看| 欧美牲交A欧美在线| 海晏县| 亚洲AV日韩AV激情亚洲| 亚洲高潮喷水无码AV电影 | 成人福利一区二区视频在线| 无码人妻精品一区二区三| 视频一区二区三区高清在线| 亚洲第一精品一二三区| 亚洲天堂av日韩精品| av高清无码 在线播放| 成人拍拍拍无遮挡免费视频| 国产丰满麻豆videossexhd| 亚洲熟女一区二区av| 国产成人精彩在线视频50| 精品无码三级在线观看视频 | 国产高潮刺激叫喊视频| 国产精品剧情亚洲二区| 国产一区二区日韩在线| 日本高清日本在线免费| 亚洲日本国产精品一区| 日本高清中文字幕免费一区二区| 辽中县|