匿名函數、高階函數、推導式

前言

木子本人搞起Python已有多年,一直以爲什麼都會,可是有時候實操起來,才以爲不少底層基礎的知識都沒有完全的靈活掌握。 另外,網上關於Python基礎知識的各類普及已有太多太多。 附上相關大神的技術棧:html

本人的寫做水平有限,確定比不上各類大佬的技術文章。博客只是對於自身知識的總結,提煉,固然若是可以幫助到各位看客,木子本人也很是高興。python


簡述

閒話很少說,本篇博客,主要針對Python的express

匿名函數 lambdabash

高階函數 map reduce filterdom

推導式 list set dict函數

三個方面來彙總。網站


匿名函數

當咱們在傳入函數時,有些時候,不須要顯式地定義函數,那麼此時匿名函數就灰常方便了。ui

Python官方文檔--lambdaspa

示例: 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()

老規矩,官方文檔走一波:

Python官方文檔--map()

針對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

reduce()

爲便於掌握,對比,在總結完map()函數後,咱們來看下reduce()函數。

Python官方文檔--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()函數顧名思義,進行過濾判斷。

Python官方文檔--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}
複製代碼

很神奇有木有,目前寫的只是最基本的推導式寫法,在實際的工做中,能夠添加各類判斷,隨意靈活運用。

總結

本篇博客側重於實際工做中代碼的簡化,重構。若能結合實際工做需求,靈活運用,則能大大簡化代碼,也方便他人閱讀,長此以往,本身的水平也逐漸提升。 起止一個爽字了得!!! 江湖有緣,下期再見!

相關文章
相關標籤/搜索