2020,做一個無可替代的人!
寫在前面的話
前面寫的 Python 入門教程中只有基礎入門和基礎進階兩部分,可以在公衆號下拉菜單中
找到,小一我都已經分好類了。
做數據分析的話,我覺得高階部分的內容你一節都不要錯過,這部分內容算是數據預處理的核心了。
我也將會從高階函數的使用
,NumPy
,SciPy
,Pandas
以及可能會用到的 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入門高階教程-高階函數