木子本人搞起Python已有多年,一直以爲什麼都會,可是有時候實操起來,才以爲不少底層基礎的知識都沒有完全的靈活掌握。 另外,網上關於Python基礎知識的各類普及已有太多太多。 附上相關大神的技術棧:html
本人的寫做水平有限,確定比不上各類大佬的技術文章。博客只是對於自身知識的總結,提煉,固然若是可以幫助到各位看客,木子本人也很是高興。python
閒話很少說,本篇博客,主要針對Python的express
匿名函數 lambdabash
高階函數 map reduce filterdom
推導式 list set dict函數
三個方面來彙總。網站
當咱們在傳入函數時,有些時候,不須要顯式地定義函數,那麼此時匿名函數就灰常方便了。ui
示例: lambda a, b: a + b
實際上就是下面代碼的簡寫3d
def func(a, b):
return a + b
複製代碼
對於匿名函數而言,不用寫return
,返回值就是該表達式的結果。 由於沒有函數名字,沒必要擔憂函數名的衝突,此外,匿名函數也是一個函數對象,能夠把匿名函數賦值給一個變量,再利用變量來調用該函數:
>>> f = lambda x: x * x
>>> f
<function <lambda> at 0x10453d7d0>
>>> f(6)
36
複製代碼
那麼在一些簡單的狀況下,盡情的使用匿名函數吧。
何爲高階函數?
能接受函數作參數的函數
因Python中一切皆對象,變量名能夠指向函數,而函數的參數能夠接收變量,那麼一個函數就能夠接收另一個函數做爲參數。這就是傳說中的高階函數。
老規矩,官方文檔走一波:
針對map(function, iterable, ...)函數,可結合lambda使用,示例以下:
>>> list(map(lambda x:x*x, [1,2,3,4,5]))
>>> [1, 4, 9, 16, 25]
複製代碼
注:Python3中,須要使用list()將map函數返回值轉化爲列表,若無list(),則結果爲:
>>> map(lambda x:x*x, [1,2,3,4,5])
>>> <map at 0x20b225167f0>
複製代碼
此外,map()函數不改變原有的 list,而是返回一個新的 list。
爲便於掌握,對比,在總結完map()函數後,咱們來看下reduce()函數。
那麼從官方文檔的介紹來看:
reduce()函數接收的參數和 map()相似,一個函數 f,一個list,但行爲和 map()不一樣,reduce()傳入的函數 f 必須接收兩個參數,reduce()對list的每一個元素反覆調用函數f,並返回最終結果值。
示例以下:
from functools import reduce
>>> reduce(lambda x, y: x + y, [1, 2, 3, 4, 5])
複製代碼
對結果演示即:((((1+2)+3)+4)+5) = 15
注:
reduce()函數可接收第三個參數,做爲函數的起始值
filter()函數顧名思義,進行過濾判斷。
對於filter()函數來講,其接收一個函數 f 和一個list,這個函數 f 的做用是對每一個元素進行判斷,返回 True或 False。
示例:過濾出1~100中平方根是整數的數:
import math
def func(x):
r = int(math.sqrt(x)) # math.sqrt()計算平方根
if r * r == x:
return x
>>> list(filter(func, range(1, 101)))
>>> [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
複製代碼
那麼從該示例中,咱們可以得出結論: filter()根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新list。
推導式在平常工做中是比較好的裝逼利器,對於列表,字典,集合的操做,不少時候一行代碼便可解決,如若沒有,那說明內力還不夠深厚,嘎嘎嘎。。。。 對於推導式而言,咱們就從
列表推導式
字典推導式
集合推導式
來總結,固然也就這三種。。。
示例:
from random import randint
>>> [randint(1, 10) for _ in range(20)]
>>> [8, 2, 7, 9, 7, 3, 10, 10, 2, 10, 5, 9, 4, 7, 9, 2, 10, 6, 10, 7]
複製代碼
示例:
>>> {x: x * x for x in range(10) if x % 3 == 0}
>>> {0: 0, 3: 9, 6: 36, 9: 81}
複製代碼
鑑於集合具備去重效果,那麼咱們建立示例,來和列表推導式對比:
from random import randint
>>> {randint(1, 10) for _ in range(20)}
>>> {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
複製代碼
很神奇有木有,目前寫的只是最基本的推導式寫法,在實際的工做中,能夠添加各類判斷,隨意靈活運用。
本篇博客側重於實際工做中代碼的簡化,重構。若能結合實際工做需求,靈活運用,則能大大簡化代碼,也方便他人閱讀,長此以往,本身的水平也逐漸提升。 起止一個爽字了得!!! 江湖有緣,下期再見!