Python入門高階教程-高階函數

2020,做一個無可替代的人!



寫在前面的話

前面寫的 Python 入門教程中只有基礎入門和基礎進階兩部分,可以在公衆號下拉菜單中找到,小一我都已經分好類了。

文章首發:公衆號『知秋一』

做數據分析的話,我覺得高階部分的內容你一節都不要錯過,這部分內容算是數據預處理的核心了。

我也將會從高階函數的使用NumPySciPyPandas 以及可能會用到的 Scikit-learn 幾個部分開始。

你可能現在還不懂這些基礎包是幹什麼的,這不重要,我會在乾貨內容中插入一些我踩過坑的小項目,回過頭你再來品一下文章,想必收穫會非常大。


正文

Lambda 函數

準確的說,Lambda 函數並不能稱爲高階函數。但是在實際項目的開發過程中,Lambda 函數使用的相當頻繁,並且效率也相當高,所以,一起來看看吧!

Lambda 函數又稱爲 Python 的匿名函數,一次性函數。

Lambda函數是使用 lambda 運算符創建的,可以包含任意多的參數,但它只有一個表達式。其語法如下:

lambda參數:表達式

例如:計算一個數的平方

# 通過 lambda 表達式計算一個數的平方
result = lambda x: x*x
print(result(5))

例如:計算兩個數相乘

# 通過 lambda 表達式計算兩個數相乘
result = lambda x, y: x*y
print(result(2, 5))

可能大家都明白 lambda 函數怎麼用了吧。

相比起普通函數,爲什麼 lambda 表達式會更簡單方便呢,我再舉個例子:

# 輸出10以內每個數乘以2:
# 定義函數
def new_func(number):
	return number*2

# 一般函數寫法
result_number = [new_func(number) for number in range(10)]
print(result_number)

# lambda 函數寫法
result_number = list(map(lambda x: x*2, [number for number in range(10)]))
print(result_number)

# 輸出結果
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

可以看到,同樣的結果,使用 lambda 的方式會更簡單些。

這裏在 lambda 表達式中使用了高階函數 map,後面也會介紹到,往下看

map 函數

說到map,我首先想到的是 Java 中的 map 數據類型,Map<K,V>一種鍵值對的存儲方式。

其次想到的是 reduce,map-reduce,Hadoop早期的一種大數據處理方式。

放一張 Google MapReduce 的中文版摘要,大家細品

文章首發:公衆號『知秋小一』

map 函數是 Python 的內建函數,可以直接使用。

map() 函數接接收兩個參數,一個是 函數,一個是 可迭代對象 Iterable。

map將傳入的函數依次作用到每個Iterable 上,並把結果作爲新的 Iterator 返回

別慌,上面一段話你可能雲裏霧裏,我舉個例子你在品

舉例:有一個函數f(x)=x*2,要把這個函數作用在list [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]上

熟不熟悉?這不就是上面 lambda 中的例子嗎?

其中,0-9數據集合是可迭代對象, f(x)=x*2作爲我們的 lambda 函數,返回的新數據集是 Iterator

再來個例子,將剛纔的 list [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 全部轉換爲字符

# 將[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 全部轉換爲字符
list(map(str, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]))

# 輸出
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

看懂了吧,map() 就是一個映射函數,會根據提供的函數對指定序列做映射,映射的結果可以進行相應的類型轉換

reduce 函數

再來看 reduce 函數,reduce 函數也是 Python 的內建函數,可以直接使用。

reduce() 函數接收和 map 同樣的兩個參數,不同的是 reduce 把上一次的結果繼續和序列的下一個元素做累積計算

直接看例子:

# 猜猜這是在幹嘛?
reduce(lambda x,y: x+y, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

# 輸出
45

你可能猜到了,做累加,對,沒錯!0~9數字的累加和,結果是45

reduce 函數的效果可以這樣表示

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

再來張圖,別說你還看不懂:

文章首發:公衆號『知秋小一』

reduce() 是累積運算函數,會根據提供的運算函數對迭代類型參數中的元素進行累積運算

filter 函數

filter 的中文翻譯是過濾,filter 函數也是 Python 的內建函數,可以直接使用。

filter() 函數同樣接收兩個參數:一個函數和一個序列。

filter() 把傳入的函數依次作用於每個元素,然後根據返回值是 True 或者 False 決定保留還是丟棄該元素

這個介紹應該都能看懂,就把 filter 想象成一個過濾器。

看個例子:對於 list [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 輸出其中的偶數

# 輸出所有的偶數
list(filter(lambda x:x%2==0, [1, 2, 3, 4, 5, 6, 7, 8, 9]))

# 輸出
[2, 4, 6, 8]

很簡單,filter() 是過濾函數,會根據提供的過濾函數對迭代類型參數中的元素進行過濾,保留使運算函數返回 true 的元素。

sorted 函數

sorted 函數也如它的中文意思一樣,可以對所有可迭代的對象進行排序操作。

看一下sorted 的語法 :

sorted(iterable, cmp=None, key=None, reverse=False)
  • iterable :表示一個可迭代對象
  • cmp:比較的函數,比較可迭代對象中的兩個對象
  • key:要來比較的元素
  • reverse:排序規則。reverse = True 降序 , reverse = False 升序(默認)

舉例1:將[2, 5, 7, 8, 1, -1]從大到小排列

sorted([2, 5, 7, 8, 1, -1], reverse=True)

# 輸出
[8, 7, 5, 2, 1, -1]

舉例2:將 [(‘b’,2),(‘a’,1),(‘c’,3),(‘d’,4)] 比較每個元組的第一位數進行排序

list_number = [('b', 2), ('a', 1), ('c', 3), ('d', 4)]
sorted(list_number, key=lambda x: x[0])

# 輸出
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

可以看到,sorted 函數支持的排序更加的廣泛。

這裏不要將 sort 和 sorted 搞混了,sort 函數用於對列表進行排序,而 sorted 函數支持對所有可迭代對象進行排序


總結一下:

今天介紹了 Python 的一些高階函數,而且是最常用的一些。

  • lambda 函數:匿名函數,搭配下面幾個函數有意想不到的效果

  • map 函數:對迭代類型參數中的元素做映射操作

  • reduce 函數:對迭代類型參數中的元素進行累積運算

  • filter 函數:對迭代類型參數中的元素進行過濾

  • sorted 函數:對所有可迭代的對象進行排序操作


寫在後面的話

春節期間在家裏就開始準備了高階部分的內容,確實不好寫。

在寫的時候得想想之前自己都踩過的哪些坑,自己是怎麼認識並使用這些高階技巧的,所以到現在我也只寫了一小丟丟內容。(熬夜多了腦袋記不住事啊)

就拿今天的幾個高階函數來說,我剛開始接觸的時候不知道這些函數這麼有用,甚至都不知道這些函數,並不重視,等到自己造完輪子之後才發現是在做無用功。

2019年公衆號的文章進度是在爬蟲這一部分,還有爬蟲框架沒有介紹,乾貨內容也不多了,後面應該會多一些實戰的爬蟲項目。

但是,我在爬蟲剛開始的時候就說過,數據分析的重點不是爬蟲,是在數據處理這一塊,大家最好能分清重點,以後就不再多說了。

碎碎念一下

2020年的第一篇乾貨文章,我需要你們的支持!關注點贊噢!

方便以後的高階文章你們不會錯過,建議直接關注公衆號[知秋小一]!!!


原創不易,歡迎點贊噢

文章首發:公衆號【知秋小一】

文章同步:掘金,簡書

原文鏈接: Python入門高階教程-高階函數



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章