1. 程式人生 > 實用技巧 >mep reduce filter sorted 匿名函式 以及遞迴的應用

mep reduce filter sorted 匿名函式 以及遞迴的應用

四大高階函式

  • map
  • reduce
  • filter
  • sorted

目標

掌握map函式、reduce函式、filter函式、sorted函式


步驟

1.map函式
  • 根據提供的函式對指定序列做對映
map(function, iterable, ...)
  • 使用可迭代物件(指定的序列)中的每個元素呼叫函式,將返回值作為新可迭代物件元素;返回值為新的可迭代物件。
def my_add(item):
    return item + 10

result = map(my_add, [1,2,3,4,5,6])

result2 = list(result)
print(result2)
  • map函式的引數第一個為自定義的函式,這裡沒有括號
  • 第二個引數不僅僅是列表型別,只要為可迭代物件即可
  • map函式的返回值為map型別,如果想要拿到裡面的資料,①可以使用list()強轉;②for迴圈遍歷
2.reduce函式
  • 對指定的序列內的元素進行累積
reduce(function, sequence [, initial] ) -> value

function引數是一個有兩個引數的函式,reduce依次從sequence中取一個元素,和上一次呼叫function的結果做引數再次呼叫function`。

from functools import reduce

def my_add(a, b):
    return a * b

result = reduce(my_add, [1,2,3,4])
print(result)
  • reduce需要先進行匯入模組 functools import reduce
  • 定義函式,此函式需要有兩個引數(規則函式)
  • reduce(函式名, 序列)
  • reduce返回的結果為int型別,可以直接使用

3.filter函式
  • 根據條件,過濾掉不符合條件的元素,最終返回一個迭代器物件
list01 = [1,2,3,4,5,6,7,8,9]


def find_num(item):
    if item % 2 == 0:
        return True
    else:
        return False
  • filter函式的作用:
  • 將可迭代物件的元素依次傳入的指定的函式中,如果可迭代物件的單個元素傳入後,函式返回True,則這個元素被保留下來,如果一個元素傳入函式後,函式返回False,則這個元素被拋棄掉,最終保留下來的所有元素放置到一個迭代器中,filter可以實現篩選的功能。
4.sorted函式
  • 對所有可迭代物件進行排序操作
sorted(iterable,  key=abs,  reverse=False)
  • sort 與 sorted 之間的區別
sort 是應用在list上的方法,sorted可以對所有可迭代喜愛那個進行排序操作

list 的 sort 方法返回的是對已經存在的列表進行操作,而內建的函式sorted 方法返回的是一個新的list,而不是在原來的基礎上進行的操作。
# t1 = (1,2,6,8,5,4,3)
# ret = tuple(sorted(t1))
# print(ret)


s = "adfskjlsjafuz"
ret = sorted(s)
print(ret)
  • 匿名函式
  • lambda表示式

步驟

1.匿名函式的介紹

定義函式使用def關鍵字, python還提供一種生成函式物件的表示式形式---匿名函式(lambda表示式)

lambda表示式能建立一個可呼叫的函式, 其返回函式本身而不是賦值給一個變數名, 這就是為什麼lambda稱之為匿名函式的原因.

2.匿名函式的格式
lambda表示式的語法:
       lambda argument_list: expression
  • argument_list是引數列表。他的結構與Python函式中的引數列表是一樣的,expression是一個關於引數的表示式,並且他們一定是單行的。

  • 程式碼案例

def my_add(num1, num2):
    print(num1 + num2)

my_add(10, 20)


# lambda 表示式來完成
f = lambda num1, num2: print(num1+num2)
f(10, 20)
f(20, 30)
3.匿名函式的案例
list01 = [10,20,5,4,63,72]

def find_max(obj):
    print(max(obj))

find_max(list01)

f = lambda obj: print(max(obj))
f(list01)
1.什麼是遞迴
  • 將問題分解為規模更小的相同問題,
  • 持續分解,直到問題規模小到可以用非常簡單直 接的方式來解決。
  • 遞迴的問題分解方式非常獨特,其演算法方面的明
  • 顯特徵就是:在演算法流程中呼叫自身。
2.問題回顧

給定一個列表,返回所有數的和。

(既不能使用for,又不能使用while,同時還不確定列表的長度)

該如何設計程式碼程式

3.問題分析
  • 求和實際上最終是由一次次的加法實現的,而加法恰恰有2個運算元
  • 將問題規模較大的列表求和,分解為規模較小而且固定的2個數求和(加法)?
  • 同樣是求和問題,但規模發生了變化,符合遞迴解決問題的特徵!
4.換個方式來思考

1 + (3 + (5 + ((7 + 9))))

觀察上述過程中所包含的重複模式,可以把求和問題歸納

數列的和 = “首個數” + “餘下數列” 的 和

如果數列包含的數少到只有1個的話,它的和就是這個數了 (這是規模小到可以做最簡單的處理)