Python 入門之經典函式例項之Map-Reduce - 對映與歸約的思想

Code-Dragon發表於2020-11-14

任務描述

Python 中有兩個非常常見的內建函式:map()和reduce()函式。這兩個函式都是應用於序列的處理函式,map()用於對映,reduce()用於歸併。本關目標就是讓學習者瞭解並掌握map()和reduce()函式的相關知識。

相關知識

map()函式會根據傳入的函式對指定的序列做對映。map()函式接收兩個引數,一個是function函式,另一個引數是一個或多個序列。map()函式會將傳入的函式依次作用到傳入序列的每個元素,並把結果作為新的序列返回。map()函式的定義為:

map(function, sequence[, sequence, …]) -> list
例如,我們要對一個列表序列中的每個數值元素進行平方運算,結合上一關提到的lambda函式的例子,程式程式碼如下:

r = map(lambda x: x ** 2, [1, 2, 3, 4,])
print(list(r))

輸出結果:

[1, 4, 9, 16]
當map()函式的第二個引數中存在多個序列時,會依次將每個序列中相同位置的元素一起做引數並呼叫function函式。例如,要對map()函式傳入的兩個序列中的元素依次求和,程式程式碼如下:

r = map(lambda x, y: x + y, [1, 2, 3, 4, 5], [6, 7, 8, 9, 10])
print(list(r))

輸出結果:

[7, 9, 11, 13, 15]
當map()函式傳入的序列有多個時,我們要注意function函式的引數數量,應和map()函式傳入的序列數量相匹配。

reduce()函式把傳入的函式作用在一個序列[x1, x2, x3, …]上,且這個函式必須要接收兩個引數。reduce()函式把第一次計算的結果繼續和序列中的下一個元素做累積計算。reduce()函式的定義為:

reduce(function, sequence[, initial]) -> value
function引數是有兩個引數的函式,reduce()函式依次在序列中取元素,並和上一次呼叫function函式的結果做引數,然後再次呼叫function函式。例如:

from functools import reduce
r = reduce(lambda x, y: x + y, [1, 2, 3, 4, 5],6)
print(r)

輸出結果:

21
在上述例子中,程式的計算順序為((((((1+6)+2)+3)+4)+5))。

小結

map()和reduce()函式的應用十分廣泛,在分散式計算領域有著十分重要的運用。我們期待著學習者在今後的開發道路上對map()和reduce()函式有更加深刻的體驗。

程式設計要求

本關的程式設計任務是補全src/step3/map-reduce.py檔案的程式碼,實現相應的功能。具體要求如下:

將輸入的一個正整數分解質因數,並將結果輸出。例如:輸入90,列印出90=2335
本關涉及的程式碼檔案src/step3/map-reduce.py的程式碼框架如下:

# coding=utf-8
# 輸入一個正整數
x = int(input())
# 請在此新增程式碼,將輸入的一個正整數分解質因數
########## Begin ##########
########## End ##########
# 輸出結果,利用map()函式將結果按照規定格式輸出
print(x,'=','*'.join(map(str,result)))

測試說明
本關的測試檔案是src/step3/map-reduce.py,測試過程如下:

平臺自動編譯生成map-reduce.exe;
平臺執行map-reduce.exe,並以標準輸入方式提供測試輸入;
平臺獲取map-reduce.exe輸出,並將其輸出與預期輸出對比。如果一致則測試通過,否則測試失敗。
以下是平臺對src/step3/map-reduce.py的樣例測試集:

測試輸入:

80
預期輸出:

80 = 22225
測試輸入:

79
預期輸出:

79 = 79
測試輸入:

225
預期輸出:

225 = 335*5
測試輸入:

123456
預期輸出:

123456 = 2222223*643

參考答案

# coding=utf-8

# 輸入一個正整數
x = int(input())

# 請在此新增程式碼,將輸入的一個正整數分解質因數
########## Begin ##########
def isPrime(n):
    flag = True
    for i in range(2,n):
        if n % i == 0:
            flag = False
        else:
            flag = True
    return flag

def PrimeFator(n):
    ls = []
    while n != 1:
        for i in range(2,n+1):
            if isPrime(i) and n % i == 0:
                ls.append(i)
                n = int(n/i)
                break
    return ls
result = PrimeFator(x)
########## End ##########

# 輸出結果,利用map()函式將結果按照規定字串格式輸出
print(x,'=','*'.join(map(str,result)))



相關文章