python小课堂28_python小课堂28
前言
嗨!大家好哇,一星期沒見了,后臺收到朋友的留言以為我停更了....哇哈哈哈時間永遠留不住,在春節期間,擁有這么多空閑時間的你,有木有好好充電呢?讓我們繼續回歸python小課堂之路,本章為進階篇,介紹的是匿名函數與高階函數。
匿名函數之 lambda 表達式
見名知意,所謂的匿名函數就是沒有名字的函數。我們平時所寫的函數都是帶有名字和參數的,并且有返回值,而匿名函數的寫法卻非常簡潔,對于初學者而言,代碼的閱讀性可能會較差一些,但是多加實踐,看習慣了之后就能明白所謂的lambda表達式是什么意思了!接下來還是用示例說話,場景是這樣的:有個函數,傳入兩個參數a和b,在函數內部將他們做差,并將結果返回。
示例1 - 普通函數:
示例2 - 匿名函數:
解釋一下上面的案例,使用 python 中的 lambda 關鍵詞來定義匿名函數,參數在冒號前面,表達式在冒號后面,將整個 lambda 表達式賦予一個變量sub,通過調用sub傳入參數得到結果result,與普通函數得到一致的結果。
匿名函數的寫法,通過關鍵詞 lambda 來表示匿名,基于數學中的λ演算得名。lambda表達式完整的寫法公式如下:
什么意思呢?通過 lambda 后面跟上傳入的參數,加上冒號,以及冒號后面的表達式組成了匿名函數,注意:冒號后面一定要是表達式!
表達式意味著,如果我們寫成賦值語句或者for循環語句等非表達式語句,那么 lambda 表達式則會報錯!如下:
所以由此引出了匿名函數 lambda 中常用的三元表達式。
示例3 - Python的三元表達式:
假設現在有兩個變量,a = 1,b = 2,請使用一行代碼來判斷 a 小于 b ,若 a 小于 b 為真,則將 a 的值返回。
result 這一行就是所謂的 Python 中的三元表達式,用中文描述一下就是:
高階函數
高階函數,Python中自帶了一些高階特性的函數,在某些特定場景下非常實用,這里舉幾個常用的,當然也會結合具體場景去說,畢竟要結合使用不能濫用!
1. map 函數
map 函數,map中文意思是地圖的意思,但是在程序中代表映射的意思。高中學過的映射,不知大家是否還記得!跟那個意思差不多。。。
場景如下:現在有一個 list_a ,它其中的包含著 1~6 的數字,請將此集合中的數字都乘以 2 ,最終得到的結果組成一個新的 list_b。
不使用 map ,你會怎么做呢?思考一下,然后再看下面的答案:
通過 for 循環取出 list 每個值,在對其調用乘2的函數,最后將結果進行拼接,得到 list_b 。
使用 map 函數之前,先了解下 map 函數語法:
map(function, iterable, ...)
map() 會根據提供的函數對指定序列做映射。 第一個參數 function 以參數序列中的每一個元素調用 function 函數,返回包含每次 function 函數返回值的新列表。
可以看到,素質三連print!得到的結果,map返回的結果是一個 map 對象,而它本身的類型就是 map,將其轉化為 list,可以得到與不用 map 函數時的一樣結果!
實際上,如果會活學活用的話,還可以將上述代碼進行縮減,用我們剛學過的 lambda 表達式來完成!
將普通函數注釋掉,使用匿名函數來完成,實際上就3行代碼即可完成,如下:
如果有多個參數作為匿名函數的入參如何寫呢?
可以使用 pycharm 自帶的源碼查看功能,查看 map 函數的定義,按住 Ctrl 點擊 map 即可:
map 第一個參數傳入函數名稱,第二個傳入的是一個可以迭代的對象,例如list,而用紅框標出來的其中包括了一個 * 號,在Python中參數前面跟一個星號代表多個形參的意思。所以我們可以寫法如下,當有兩個相同 list 時,多次傳入 map 函數中即可:
現在是相同的個數的 list ,如果要是不同個數內容的 list 會如何?做個實驗,將 list_b 的個數改為 10 個觀察下:
可以看到,即使兩個不同內容的list進行map計算,最終結果也會根據內容少的list得到最終結果,也就是只進行前6位的計算。
2. reduce 函數
reduce 函數不能直接進行引用,在 Python3 中,reduce() 函數已經被從全局命名空間里移除了,它現在被放置在 functools 模塊里,如果想要使用它,則需要通過引入 functools 模塊來調用 reduce() 函數,還是先來看下 reduce 函數的語法使用:
reduce(function, iterable[, initializer])
function -- 函數,有兩個參數
iterable -- 可迭代對象
initializer -- 可選,初始參數
函數將一個數據集合(鏈表,元組等)中的所有數據進行下列操作:用傳給 reduce 中的函數 function(有兩個參數)先對集合中的第 1、2 個元素進行操作,得到的結果再與第三個數據用 function 函數運算,最后得到一個結果。
老規矩,點進去看源碼,其中有官方的文檔注釋:
咱們就用它注釋中的例子來實踐一下,作為 reduce 的第一個函數,入參必須是兩個參數,否則會報錯,例如下面:
改成官方例子:
素質二連,print出結果,可以看到這次與 map 函數不同,返回的結果是一個計算后的整數 15 !這個 reduce 函數是怎么算出來的呢?仔細看過注釋的同學一定知道怎么來的了,實際上就是這樣來的:
第一次計算時,x = 1,y = 2,于是將 1 + 2 = 3 的結果作為下一次調用時入參的x,而第二次計算時的 y 則是列表中的數字3 ......以此類推。
(1+2) --> ((1+2)+3) --> .... --> ((((1+2)+3)+4)+5)
reduce 函數是一個連續計算的函數!
再來看下 reduce 函數的第三個參數,初始化第一個入參值:
這個計算的順序則是第一次 x = 10,y = 1,將 x+y 的值 11 賦予第二次計算的 x 作為入參,第二次計算時的 y = 2,第二次計算結果等于 11 + 2 = 13 .... 以此類推。
(10+1) --> (10+1)+2) --> ((10+1)+2)+3) .... --> ((((10+1)+2)+3)+4)+5)
3. filter 函數
filter 函數,這個英文單詞的中文含義是過濾的意思。依然是看下官方語法:
filter(function, iterable)
function -- 判斷函數。
iterable -- 可迭代對象。
filter() 函數用于過濾序列,過濾掉不符合條件的元素,返回由符合條件元素組成的新列表。 該接收兩個參數,第一個為函數,第二個為序列,序列的每個元素作為參數傳遞給函數進行判,然后返回 True 或 False,最后將返回 True 的元素放到新列表中。
示例,請將下面的 list 中為小寫字母的字符串提取出來,生成一個新的列表:
思考一下再看答案喲:
結果如上圖,通過字符串的自帶函數,islower() 可以判斷字符串是否是小寫字母,若是小寫字母則返回一個 True ,可以看到筆者的 lambda 表達式用了一個三元表達式的寫法,來過濾掉了原列表的大寫字母,是不是很簡潔呢!畢竟人生苦短,我用Python啊!
map - reduce 擴展知識
map / reduce 實際上是大數據中的一個編程模型,其中 map 代表映射的意思,reduce 代表歸約的意思,而這個模型主要是用來進行并行計算的!可以用一張圖來看生動的看下 hadoop (Hadoop是一個由Apache基金會所開發的分布式系統基礎架構。)中的 map / reduce:
做三明治,用到了各種蔬菜,首先我們先將每個蔬菜切碎,通過map 映射成碎片,在使用 reduce 進行并行計算使之合體!
總結
說一些學習上的技巧,對于一個新的函數,首先學習看它的語法,第一時間可以去找官方文檔看,比如點進去看它的官方注釋,如果英文看不懂的話呢,可以去菜鳥教程上搜下,上面也是有不少官方文檔的定義,都是中文教程。寫到現在,大部分Python小課堂上的小實例都是非常簡單的,入門與進階通俗易懂,但是不要小瞧這些小 demo ,如果你真的把它們都弄明白了,就像前期種下一顆種子一樣,穩定根基之后必將作為長成參天大樹的必要前提!
著作權歸作者所有
總結
以上是生活随笔為你收集整理的python小课堂28_python小课堂28的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ZigBee智能节水灌溉系统
- 下一篇: 唯品会密码JS解密与python登录!