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

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



寫在前面的話

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

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

作數據分析的話,我以爲高階部分的內容你一節都不要錯過,這部份內容算是數據預處理的核心了。框架

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

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


oop

正文

Lambda 函數

準確的說,Lambda 函數並不能稱爲高階函數。可是在實際項目的開發過程當中,Lambda 函數使用的至關頻繁,而且效率也至關高,因此,一塊兒來看看吧!大數據

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

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

lambda參數:表達式翻譯

例如:計算一個數的平方3d

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

例如:計算兩個數相乘code

# 經過 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入門高階教程-高階函數

相關文章
相關標籤/搜索