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

        共 7316字,需瀏覽 15分鐘

         ·

        2021-03-03 13:17


        大家好,歡迎來到 Crossin的編程教室 !

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

        今天我們就來給大家說說幾個常用的高階函數(shù)。

        一、map函數(shù)

        map(function, iterable, ...)

        返回一個將 function 應用于 iterable 中每一項并輸出其結(jié)果的迭代器。如果傳入了額外的 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
        結(jié)果如下:
        2020 9 3
        <class 'int'> <class 'int'> <class 'int'>
        import math
        # 對數(shù)據(jù)做映射
        print(list(map(lambda x: 2 ** x + 1, [1357])))   
        print(list(map(lambda y: math.log10(y), [10100100010000])))
        print(list(map(lambda x, y: x ** 2 + y, [12345], [12345])))

        運行結(jié)果如下:
        [3933129]
        [1.02.03.04.0]
        [26122030]
        再舉個簡單例子,假設用戶輸入的英文名字不規(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'])))

        運行結(jié)果如下:
        ['Bob''Lisa''Bart''Faker']
        ['Bob''Lisa''Bart''Faker']

        二、filter函數(shù)

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

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

        lis = [12345678910]
        print(list(filter(lambda x: x % 2, lis)))      # 符合條件  得到奇數(shù)
        print(list(filter(lambda y: y % 2 == 0, lis))) # 得到偶數(shù)

        運行結(jié)果如下:
        [13579]
        [246810]
        # 如果 function 是None,則會假設它是一個身份函數(shù),即 iterable 中所有返回假的元素會被移除。
        s = [12'', [], {}, (), '123']
        print(list(filter(None, s)))

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

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

        def odd_sequence():    # 構(gòu)造從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ù),它們都必須指定為關(guān)鍵字參數(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])

        運行結(jié)果如下:
        學號 姓名 成績
        002 李四 90
        001 張三 88
        003 王五 73
        # 輸入一組數(shù)到列表nums,請找到列表中任意兩個元素相加能夠等于9的元素,形成一個元組
        # 使其小數(shù)在前大數(shù)在后,如:(2,7),(1,8)。重復的元組元素只保留一個,結(jié)果按元組第一個元素從大到小順序輸出
        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)

        運行結(jié)果如下:
        numbers:3,4,5,7,2,8,1,6,9,0
        [(45), (36), (27), (18), (09)]

        四、reduce函數(shù)

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

        from functools import reduce

        s = [0123456789]
        # 做累積計算
        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))

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

        結(jié)語

        以上就是python中高階函數(shù)的基本用法,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值。

        如果文章對你有幫助,歡迎轉(zhuǎn)發(fā)/點贊/收藏~

        作者:葉庭云

        來源:快學Python


        _往期文章推薦_

        你“聽”過這些經(jīng)典排序算法嗎?




        瀏覽 67
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

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

        手機掃一掃分享

        分享
        舉報
        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>
            国产美女免费A片在线观看写真 | 国产做受 入口 | 日韩精品欧美精品 | 免费草逼网 | 亚洲最大黄色网址 | 香蕉污污视频 | 国产精品天天爽视频 | 国产中文字幕一区二区 | 貂蝉艳史在线观看 | 日韩色色网站 |