Python3之三個內建高階函式map、filter、sorted

geek_xiong發表於2018-09-02

什麼是高階函式?

  1. 函式接收一個或多個函式作為引數傳入
  2. 函式返回一個函式
    只要滿足以上一條的函式就是高階函式了

map函式

map(function, *iterable) 返回一個可迭代物件,此可迭代物件用函式function對可迭代物件iterable中的每一個元素作為引數計算後得到新的資料。

舉個栗子就懂了,文字敘述有點繞
如:求1-9的每個元素的平方:

def power(x):
    return x ** 2

for x in map(power, range(1, 10)):
    print(x, end=' ')  # 1 4 9 16 ... 81

map(power, range(1, 10))先看這條語句,其中power是上邊的函式名,range不用說了,是一個可迭代物件。那麼它執行的流程是什麼呢?

  1. 先拿出 1 傳給power,然後return 1^2 -> 1
  2. 再拿出 2 傳給power,然後return 2^2 -> 4
  3. 再拿出 3 傳給power,然後return 3^2 -> 9
  4. 最後拿出 9 傳給power,然後return 9^2 -> 81
    總起來就是說可以這麼理解:可迭代物件有多少個就呼叫多少次對應的函式
    配個debug圖:
    這裡寫圖片描述

可迭代物件不一定只有一個,但必須和函式形參個數相同,再舉個栗子:
如:#生成一個可迭代物件,可以提供:1^4,2^3,3^2,4^1

def mypow(x, y):
    return x ** y

for i in map(mypow, [1, 2, 3, 4], (4, 3, 2, 1)):
    print(i, end=' ')

filter函式

filter(function, iterable)

filter函式的作用:

  1. 篩選可迭代物件iterable中的資料,返回一個可迭代物件,此可迭代物件只返回iterable中符合條件的資料
  2. function將對iterable中提供的每個資料進行布林求值,True則保留,否則丟棄

舉個栗子:以列表的形式列印1-10之間的奇數

def isodd(x):
    return x % 2 == 1

L = list(filter(isodd, range(10)))
print('L=', L)  # L= [1, 3, 5, 7, 9]

filter(isodd, range(10)) 先看這條,執行過程同map一樣,只不過filter返回的是True或False
如果是map返回是什麼呢?

L= [False, True, False, True, False, True, False, True, False, True]

filter可以瞭解為一個過濾器,如果返回的是True,就保留讓它返回True的這個資料,否則的話就丟棄

再舉個栗子:求1-100之間的素數(用filter實現)

def isprime(x):
    if x < 2:
        return False
    for i in range(2, x):
        if x % i == 0:  # 一旦整除,x一定不是素數
            return False
    return True

L = list(filter(isprime, range(100)))
print('L=', L)
# 結果:L= [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

sorted函式

sorted函式的作用:

將原可迭代物件的資料進行排序,生成排序後的列表

函式的引數格式:

sorted(iterable, key=None, reverse=False)

引數說明:

  • iterable 可迭代物件
  • key 函式是用來提供一個值,將這個值作為排序的依據,如果不給出這個key函式,則用原資料的值進行比較和排序

    舉幾個栗子:

>>> L = [5 , -2, -4, 0, 3, 1]
>>> L2 = sorted(L)
>>> L2
[-4, -2, 0, 1, 3, 5]

>>> L3 = sorted(L, reverse=False)
>>> L3
[-4, -2, 0, 1, 3, 5]

>>> L4 = sorted(L, reverse=True)
>>> L4
[5, 3, 1, 0, -2, -4]

以上栗子解釋reverse的作用:預設為False升序,可以不寫,如果是True則為降序

>>> L5 = sorted(L, key=abs)
>>> L5
[0, 1, -2, 3, -4, 5]

以上栗子解釋key值使用內建函式,abs是絕對值,也就是按絕對值的大小來排序,key的函式也可以自定義
如:
按字串的反序排序

names = ['Tom', 'Jerry', 'Spike', 'Tyke']
def mysorted(L):  # 依次傳入name的值
    return L[::-1]  # 將name字串反轉

print(sorted(names, key = mysorted))
# 結果: ['Spike', 'Tyke', 'Tom', 'Jerry']

提示:反轉後的names列表是:
names = [‘Tyke’, ‘Spike’, ‘Jerry’, ‘Tom’] ,然後按照這個排序

本節完

相關文章