<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python編程 高階函數(shù)使用技巧

          共 3596字,需瀏覽 8分鐘

           ·

          2020-11-03 08:17

          在堅(jiān)持的初期,堅(jiān)持本身比堅(jiān)持的事情更重要。也許,生活的意義并不在于實(shí)現(xiàn)了怎樣偉大的夢(mèng)想,而是在于自己全身心地投入,讓每一天都成為夢(mèng)想的一部分。只要是能確定帶給自己價(jià)值感的事情,去做就好。時(shí)間在流逝,每一天,都值得認(rèn)真對(duì)待。

          作者:葉庭云


          高階函數(shù)指的是能接收一個(gè)或多個(gè)函數(shù)作為參數(shù)的函數(shù),python中有一些內(nèi)置的高階函數(shù),在某些場(chǎng)合使用可以提高代碼的效率。

          一、map函數(shù)

          map(function,?iterable,?...)

          返回一個(gè)將 function 應(yīng)用于 iterable 中每一項(xiàng)并輸出其結(jié)果的迭代器。如果傳入了額外的 iterable 參數(shù),function 必須接受相同個(gè)數(shù)的實(shí)參并被應(yīng)用于從所有可迭代對(duì)象中并行獲取的項(xiàng)。

          y,?m,?d?=?map(int,?input().split('/'))
          print(y,?m,?d)
          print(type(y),?type(m),?type(d))

          輸入:2020/9/3
          結(jié)果如下:
          2020?9?3
          <class?'int'>?<class?'int'>?<class?'int'>
          import?math
          #?對(duì)數(shù)據(jù)做映射
          print(list(map(lambda?x:?2?**?x?+?1,?[1,?3,?5,?7])))???
          print(list(map(lambda?y:?math.log10(y),?[10,?100,?1000,?10000])))
          print(list(map(lambda?x,?y:?x?**?2?+?y,?[1,?2,?3,?4,?5],?[1,?2,?3,?4,?5])))

          運(yùn)行結(jié)果如下:
          [3,?9,?33,?129]
          [1.0,?2.0,?3.0,?4.0]
          [2,?6,?12,?20,?30]
          再舉個(gè)簡(jiǎn)單例子,假設(shè)用戶(hù)輸入的英文名字不規(guī)范,沒(méi)有按照首字母大寫(xiě),后續(xù)字母小寫(xiě)的規(guī)則
          利用map()函數(shù),把一個(gè)list(包含若干不規(guī)范的英文名字)變成一個(gè)包含規(guī)范英文名字的list。

          輸入:['bob',?'LISA',?'barT',?'faker']
          輸出:['Bob',?'Lisa',?'Bart',?'Faker']
          def?trans(s):
          ????s?=?s[0].upper()?+?s[1:].lower()??#?首字母大寫(xiě)??后續(xù)字母小寫(xiě)
          ????return?s

          print(list(map(trans,?['bob',?'LISA',?'barT',?'faker'])))
          print(list(map(lambda?x:?x[0].upper()?+?x[1:].lower(),?['bob',?'LISA',?'barT',?'faker'])))

          運(yùn)行結(jié)果如下:
          ['Bob',?'Lisa',?'Bart',?'Faker']
          ['Bob',?'Lisa',?'Bart',?'Faker']

          二、filter函數(shù)

          filter(function,?iterable)?#?function為判斷函數(shù),iterable為可迭代對(duì)象

          filter() 函數(shù)用于過(guò)濾序列,過(guò)濾掉不符合條件的元素,返回一個(gè)迭代器對(duì)象,如果要轉(zhuǎn)換為列表,可以使用 list() 來(lái)轉(zhuǎn)換。接收的兩個(gè)參數(shù)中,第一個(gè)為函數(shù),第二個(gè)為序列,序列的每個(gè)元素作為參數(shù)傳遞給函數(shù)進(jìn)行判斷,然后返回 True 或 False,最后將返回 True 的元素放到迭代器中。如果 function 是 None ,則會(huì)假設(shè)它是一個(gè)身份函數(shù),即 iterable 中所有返回假的元素會(huì)被移除。

          lis?=?[1,?2,?3,?4,?5,?6,?7,?8,?9,?10]
          print(list(filter(lambda?x:?x?%?2,?lis)))??????#?符合條件??得到奇數(shù)
          print(list(filter(lambda?y:?y?%?2?==?0,?lis)))?#?得到偶數(shù)

          運(yùn)行結(jié)果如下:
          [1,?3,?5,?7,?9]
          [2,?4,?6,?8,?10]
          #?如果 function 是None,則會(huì)假設(shè)它是一個(gè)身份函數(shù),即 iterable 中所有返回假的元素會(huì)被移除。
          s?=?[1,?2,?'',?[],?{},?(),?'123']
          print(list(filter(None,?s)))

          運(yùn)行結(jié)果如下:
          [1,?2,?'123']
          #?利用filter函數(shù)篩選出水仙花數(shù)
          #?水仙花數(shù)是指一個(gè)3位數(shù),它的每個(gè)位上的數(shù)字的3次冪之和等于它本身(例如:1^3 + 5^3 + 3^3 = 153)
          lis?=?[i?for?i?in?range(100,?1001)]??#?三位數(shù)
          #?輸出水仙花數(shù)
          print(list(filter(lambda?x:?x?==?sum([int(i)?**?3?for?i?in?str(x)]),?lis)))

          運(yùn)行結(jié)果如下:
          [153,?370,?371,?407]
          在這里插入圖片描述
          #?filter的應(yīng)用案例-埃氏篩法求素?cái)?shù)

          def?odd_sequence():????#?構(gòu)造從3開(kāi)始的奇數(shù)序列
          ????n?=?1
          ????while?True:
          ????????n?=?n?+?2
          ????????yield?n


          def?prime_filter(prime_num):???#?篩選素?cái)?shù)的函數(shù)
          ????return?lambda?x:?x?%?prime_num?>?0


          def?primes():
          ????yield?2??#?先返回第一個(gè)素?cái)?shù)2,然后利用filter()函數(shù)不斷產(chǎn)生篩選后的新序列
          ????nums?=?odd_sequence()
          ????while?True:
          ????????prime_num?=?next(nums)???#?取出序列第一個(gè)數(shù)
          ????????yield?prime_num??????????#?返回序列第一個(gè)數(shù)
          ????????nums?=?filter(prime_filter(prime_num),?nums)??#?得到新序列


          def?main():
          ????for?n?in?primes():
          ????????if?n?100000:
          ????????????print(n)
          ????????else:
          ????????????break


          if?__name__?==?'__main__':
          ????main()

          三、sorted函數(shù)

          • 根據(jù) iterable 中的項(xiàng)返回一個(gè)新的已排序列表。
          • 具有兩個(gè)可選參數(shù),它們都必須指定為關(guān)鍵字參數(shù)。key:指定帶有單個(gè)參數(shù)的函數(shù),用于從 iterable 的每個(gè)元素中提取用于比較的鍵 (例如 key=str.lower)。默認(rèn)值為 None (直接比較元素) reverse:為一個(gè)布爾值,如果設(shè)為 True,則每個(gè)列表元素將按反向順序比較進(jìn)行排序
          #?學(xué)號(hào)?姓名?成績(jī)
          d?=?{'001':?['張三',?88],?'002':?['李四',?90],?'003':?['王五',?73]}
          #?按成績(jī)排序??降序??由高到低
          d1?=?list(sorted(d.items(),?key=lambda?x:?x[1][1],?reverse=True))??????
          print('學(xué)號(hào)?姓名?成績(jī)')
          for?item?in?d1:
          ????print(item[0],?item[1][0],?item[1][1])

          運(yùn)行結(jié)果如下:
          學(xué)號(hào)?姓名?成績(jī)
          002?李四?90
          001?張三?88
          003?王五?73
          #?輸入一組數(shù)到列表nums,請(qǐng)找到列表中任意兩個(gè)元素相加能夠等于9的元素,形成一個(gè)元組
          #?使其小數(shù)在前大數(shù)在后,如:(2,7),(1,8)。重復(fù)的元組元素只保留一個(gè),結(jié)果按元組第一個(gè)元素從大到小順序輸出
          def?get_tuple(num_list):
          ????temp_list?=?[]
          ????for?i?in?num_list:
          ????????if?(9?-?i)?in?num_list:
          ????????????min_?=?(9?-?i)?if?(i?>=?(9?-?i))?else?i
          ????????????max_?=?i?if?min_?==?(9?-?i)?else?(9?-?i)
          ????????????if?(min_,?max_)?not?in?temp_list:
          ????????????????temp_list.append((min_,?max_))
          ????return?temp_list


          nums?=?input("numbers:")
          #?列表推導(dǎo)式
          num_list?=?[int(i)?for?i?in?nums.split(',')]
          result_list?=?get_tuple(num_list)
          #?按列表里每個(gè)元組的第一個(gè)元素從大到小排序??降序
          result_list?=?sorted(result_list,?key=lambda?x:?x[0],?reverse=True)
          print(result_list)

          運(yùn)行結(jié)果如下:
          numbers:3,4,5,7,2,8,1,6,9,0
          [(4,?5),?(3,?6),?(2,?7),?(1,?8),?(0,?9)]

          四、reduce函數(shù)

          reduce把一個(gè)函數(shù)作用在一個(gè)序列[x1, x2, x3, ...]上,這個(gè)函數(shù)必須接收兩個(gè)參數(shù),reduce把結(jié)果繼續(xù)和序列的下一個(gè)元素做累積計(jì)算。返回的是一個(gè)計(jì)算的最終結(jié)果。

          from?functools?import?reduce

          s?=?[0,?1,?2,?3,?4,?5,?6,?7,?8,?9]
          #?做累積計(jì)算
          print(reduce(lambda?x,y:?x?+?y,?s))
          print(reduce(lambda?x,y:?10?*?x?+?y,?s))
          print(reduce(lambda?x,y:?str(x)?+?str(y),?s))

          運(yùn)行結(jié)果如下:
          45
          123456789
          0123456789

          結(jié)語(yǔ)

          以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)小編的支持。


          由于微信平臺(tái)算法改版,公號(hào)內(nèi)容將不再以時(shí)間排序展示,如果大家想第一時(shí)間看到我們的推送,強(qiáng)烈建議星標(biāo)我們和給我們多點(diǎn)點(diǎn)【在看】。星標(biāo)具體步驟為:


          (1)點(diǎn)擊頁(yè)面最上方“小詹學(xué)Python”,進(jìn)入公眾號(hào)主頁(yè)。


          (2)點(diǎn)擊右上角的小點(diǎn)點(diǎn),在彈出頁(yè)面點(diǎn)擊“設(shè)為星標(biāo)”,就可以啦。


          感謝支持,比心。

          瀏覽 95
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产成人无码在线高清播放 | 日韩欧美三级在线观看 | 国产色天使 | 日韩三级片电影网站 | 欧美日本视频在线 |