1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 3596字,需瀏覽 8分鐘

         ·

        2020-11-03 08:17

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

        作者:葉庭云


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

        一、map函數(shù)

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

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

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

        輸入:2020/9/3
        結果如下:
        2020?9?3
        <class?'int'>?<class?'int'>?<class?'int'>
        import?math
        #?對數(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])))

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

        輸入:['bob',?'LISA',?'barT',?'faker']
        輸出:['Bob',?'Lisa',?'Bart',?'Faker']
        def?trans(s):
        ????s?=?s[0].upper()?+?s[1:].lower()??#?首字母大寫??后續(xù)字母小寫
        ????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'])))

        運行結果如下:
        ['Bob',?'Lisa',?'Bart',?'Faker']
        ['Bob',?'Lisa',?'Bart',?'Faker']

        二、filter函數(shù)

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

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

        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ù)

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

        運行結果如下:
        [1,?2,?'123']
        #?利用filter函數(shù)篩選出水仙花數(shù)
        #?水仙花數(shù)是指一個3位數(shù),它的每個位上的數(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)))

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

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


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


        def?primes():
        ????yield?2??#?先返回第一個素數(shù)2,然后利用filter()函數(shù)不斷產(chǎn)生篩選后的新序列
        ????nums?=?odd_sequence()
        ????while?True:
        ????????prime_num?=?next(nums)???#?取出序列第一個數(shù)
        ????????yield?prime_num??????????#?返回序列第一個數(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 中的項返回一個新的已排序列表。
        • 具有兩個可選參數(shù),它們都必須指定為關鍵字參數(shù)。key:指定帶有單個參數(shù)的函數(shù),用于從 iterable 的每個元素中提取用于比較的鍵 (例如 key=str.lower)。默認值為 None (直接比較元素) reverse:為一個布爾值,如果設為 True,則每個列表元素將按反向順序比較進行排序
        #?學號?姓名?成績
        d?=?{'001':?['張三',?88],?'002':?['李四',?90],?'003':?['王五',?73]}
        #?按成績排序??降序??由高到低
        d1?=?list(sorted(d.items(),?key=lambda?x:?x[1][1],?reverse=True))??????
        print('學號?姓名?成績')
        for?item?in?d1:
        ????print(item[0],?item[1][0],?item[1][1])

        運行結果如下:
        學號?姓名?成績
        002?李四?90
        001?張三?88
        003?王五?73
        #?輸入一組數(shù)到列表nums,請找到列表中任意兩個元素相加能夠等于9的元素,形成一個元組
        #?使其小數(shù)在前大數(shù)在后,如:(2,7),(1,8)。重復的元組元素只保留一個,結果按元組第一個元素從大到小順序輸出
        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:")
        #?列表推導式
        num_list?=?[int(i)?for?i?in?nums.split(',')]
        result_list?=?get_tuple(num_list)
        #?按列表里每個元組的第一個元素從大到小排序??降序
        result_list?=?sorted(result_list,?key=lambda?x:?x[0],?reverse=True)
        print(result_list)

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

        四、reduce函數(shù)

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

        from?functools?import?reduce

        s?=?[0,?1,?2,?3,?4,?5,?6,?7,?8,?9]
        #?做累積計算
        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))

        運行結果如下:
        45
        123456789
        0123456789

        結語

        以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對小編的支持。


        由于微信平臺算法改版,公號內容將不再以時間排序展示,如果大家想第一時間看到我們的推送,強烈建議星標我們和給我們多點點【在看】。星標具體步驟為:


        (1)點擊頁面最上方“小詹學Python”,進入公眾號主頁。


        (2)點擊右上角的小點點,在彈出頁面點擊“設為星標”,就可以啦。


        感謝支持,比心。

        瀏覽 95
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            曰韩无码 | 中国黄色免费 | 男人用嘴添女人下身视频 | 成人无码www在线看免费 | 性欧美大战久久久久久久 | 淫臀乱女txt | 中文字幕一区二区三区视频 | 凉森996无码中出在线播放 | 四虎国产精品永久免费观看视频 | 人人摸人人艹 |