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

          共 7316字,需瀏覽 15分鐘

           ·

          2021-03-03 13:17


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

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

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

          一、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, [1357])))   
          print(list(map(lambda y: math.log10(y), [10100100010000])))
          print(list(map(lambda x, y: x ** 2 + y, [12345], [12345])))

          運(yùn)行結(jié)果如下:
          [3933129]
          [1.02.03.04.0]
          [26122030]
          再舉個(gè)簡(jiǎn)單例子,假設(shè)用戶輸入的英文名字不規(guī)范,沒有按照首字母大寫,后續(xù)字母小寫的規(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()  # 首字母大寫  后續(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'])))

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

          二、filter函數(shù)

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

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

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

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

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

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

          def odd_sequence():    # 構(gòu)造從3開始的奇數(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
          [(45), (36), (27), (18), (09)]

          四、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 = [0123456789]
          # 做累積計(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é)語

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

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

          作者:葉庭云

          來源:快學(xué)Python


          _往期文章推薦_

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




          瀏覽 67
          點(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>
                  首页123操逼 | 免费毛片电影 | 影音先锋电影AV | 天天日天天摸天天操 | 人妻无码中文专区久久5566 |