我所理解的python中奇怪的函數(shù)類型

python語法隨意重斑,對(duì)于習(xí)慣了java和c這樣語法規(guī)范的語言來說,python用起來多多少少還有一些不習(xí)慣,最近在學(xué)習(xí)過程中見到了一些python中奇怪的函數(shù)類型构韵,而僅僅通過這些函數(shù)類型的名字也看不透這些函數(shù)到底是什么樣子的航邢,自己了解過后寫了下來耕赘。

我見到的奇怪的函數(shù)類型有四種,分別是:匿名函數(shù)膳殷、裝飾器函數(shù)操骡、生成器函數(shù)以及高階函數(shù)。

匿名函數(shù)

匿名函數(shù)在java中我們可能會(huì)想到匿名內(nèi)部類赚窃,或者是java中的lambda表達(dá)式册招,而實(shí)際上python中的匿名函數(shù)也是通過lambda來實(shí)現(xiàn)的,不過注意的是勒极,python中真的是通過lambda這個(gè)關(guān)鍵字來實(shí)現(xiàn)是掰。

例如:

add = lambda x, y: x + y

result = add(3, 5) # 結(jié)果為8

與普通函數(shù)不同,它們是一種更加簡潔的方式來編寫小型臨時(shí)函數(shù)。有了這個(gè)例子相信大家一下就能明白python中的匿名函數(shù)了辱匿。

裝飾器函數(shù)

裝飾器函數(shù)更多的是直接叫裝飾器键痛,裝飾器僅看名字可能會(huì)想到是起一個(gè)裝飾的功能,但是怎么樣去裝飾呢匾七?還是直接看例子

import time

def func():

????for x in range(1,1000000):

????????print(x)

def decoration(function):

????startTime = time.time()

????function()

????print(time.time()-startTime)

if __name__ == '__main__': ???? ????decoration(func)????#3.1974148750305176

假如我們想要測(cè)試一個(gè)函數(shù)的運(yùn)行時(shí)間絮短,我們一般的做法就是在函數(shù)的上下文上添加計(jì)時(shí)器,但是在python中昨忆,函數(shù)是可以作為一個(gè)參數(shù)傳入函數(shù)中的丁频,所以我們只需要將模板寫好,將所需要測(cè)試的函數(shù)傳進(jìn)裝飾器中即可,裝飾器不僅可以裝飾函數(shù)席里,也可以裝飾類叔磷,所以這就是裝飾器的思想,所謂裝飾,其實(shí)就是將其他的函數(shù)或類作為參數(shù)傳入,在原有基礎(chǔ)上添加一些新邏輯或者屬性后,將這個(gè)新的函數(shù)或類返回的過程奖磁。

生成器函數(shù)

生成器函數(shù)就比較特殊了改基,生成器函數(shù)主要依賴yield關(guān)鍵字實(shí)現(xiàn),先上例子

def my_generator():

????yield 1

????yield 2

????yield 3

if __name__ == '__main__':

????g = my_generator()? # 創(chuàng)建生成器對(duì)象

????print(next(g))? # 1

????print(next(g))? # 2

????print(next(g))? # 3


#在 Python3.x 中咖为,可以使用 __next__() 方法來替代 next() 方法寥裂。

def my_generator():

????yield 1

????yield 2

????yield 3

????g = my_generator()

????print(g.__next__()) #1

????print(g.__next__()) #2

????print(g.__next__()) #3

#我們還可以使用 for 循環(huán)來進(jìn)行遍歷:

def my_generator():

????yield 1

????yield 2

????yield 3

for i in my_generator():

????print(i)

我們?cè)趈ava中使用函數(shù)返回值的時(shí)候使用的都是return,而且一個(gè)函數(shù)只能返回一個(gè)值或?qū)ο蟀钙#@已經(jīng)成為了我們的共識(shí)封恰,但是在python中可以通過yield關(guān)鍵字實(shí)現(xiàn)生成器函數(shù),一個(gè)yield關(guān)鍵字就是一個(gè)返回值褐啡,而且最重要的是诺舔,生成器被使用之后會(huì)創(chuàng)建一個(gè)生成器對(duì)象,我們可以使用next()函數(shù)遍歷生成器函數(shù)中的每一個(gè)返回值备畦,yield關(guān)鍵字就相當(dāng)于生成器函數(shù)中的斷點(diǎn)低飒,我們執(zhí)行一次next,就向下走一步懂盐,這個(gè)操作和java中的迭代器是一樣的褥赊,但是不一樣的是這個(gè)生成器對(duì)象可以直接用循環(huán)遍歷。但是最后為什么要叫生成器呢莉恼?這是因?yàn)榧偃鐚⑺械臄?shù)據(jù)都創(chuàng)建出來然后放入生成器中可能會(huì)非常占用空間拌喉,在創(chuàng)建生成器的時(shí)候也會(huì)花很多時(shí)間,而生成器并沒有將所需要返回的數(shù)據(jù)一下生成出來俐银,而只是利用算法尿背,在該返回的時(shí)候通過算法得到要返回的數(shù)據(jù),然后將這個(gè)數(shù)據(jù)聲明出來返回捶惜,這樣做既節(jié)省了時(shí)間又節(jié)省了空間田藐。

import time

if __name__ == '__main__':

????start_time = time.time()

????b = [x for x in range(100000000)]? # 創(chuàng)建列表

????print(time.time() - start_time)????# 4.012589454650879s

????start_time = time.time()

????a = (x for x in range(1000000))? # 創(chuàng)建生成器

????print(time.time() - start_time)????# 0.0s


創(chuàng)建一億個(gè)簡單的數(shù)字?jǐn)?shù)據(jù),list要花費(fèi)3-4s的時(shí)間吱七,但是生成器卻僅僅花費(fèi)了不到0.01s的時(shí)間汽久,這是生成器最與眾不同的地方。

高階函數(shù)

高階函數(shù)其實(shí)很簡單踊餐,只不過起了一個(gè)很高大上的名字景醇,其實(shí)前面的裝飾器就是一個(gè)高階函數(shù),因?yàn)樵趐ython中函數(shù)可以作為一個(gè)函數(shù)去傳入函數(shù)市袖,所以自然啡直,你可以先將一個(gè)函數(shù)傳進(jìn)來,然后再對(duì)傳進(jìn)來的函數(shù)做一些操作苍碟。例如下面的例子

def func(x,y):

????return x+y

def highOrder_function(function,x,y):

????return function(x,y)

if __name__ == '__main__':

????x = highOrder_function(func,10,5)

????print(x) #15

這就是一個(gè)高階函數(shù)酒觅,這個(gè)函數(shù)顯然沒有什么用處,但是通過這種思想可以做很多事情微峰,高階函數(shù)的存在主要原因還是依賴的函數(shù)可以作為變量去傳遞舷丹。

以上就是一些奇怪的函數(shù)類型,至少在java和c中很奇怪蜓肆,以上內(nèi)容僅個(gè)人觀點(diǎn)和理解颜凯,如果出錯(cuò)歡迎指正。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末仗扬,一起剝皮案震驚了整個(gè)濱河市症概,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌早芭,老刑警劉巖彼城,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異退个,居然都是意外死亡募壕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門语盈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舱馅,“玉大人,你說我怎么就攤上這事刀荒〈停” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵缠借,是天一觀的道長资溃。 經(jīng)常有香客問我,道長烈炭,這世上最難降的妖魔是什么溶锭? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮符隙,結(jié)果婚禮上趴捅,老公的妹妹穿的比我還像新娘。我一直安慰自己霹疫,他們只是感情好拱绑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著丽蝎,像睡著了一般猎拨。 火紅的嫁衣襯著肌膚如雪膀藐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天红省,我揣著相機(jī)與錄音额各,去河邊找鬼。 笑死吧恃,一個(gè)胖子當(dāng)著我的面吹牛虾啦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播痕寓,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼傲醉,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了呻率?” 一聲冷哼從身側(cè)響起硬毕,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎礼仗,沒想到半個(gè)月后昭殉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡藐守,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年挪丢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卢厂。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乾蓬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出慎恒,到底是詐尸還是另有隱情任内,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布融柬,位于F島的核電站死嗦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏粒氧。R本人自食惡果不足惜越除,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望外盯。 院中可真熱鬧摘盆,春花似錦、人聲如沸饱苟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽箱熬。三九已至类垦,卻和暖如春狈邑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蚤认。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國打工米苹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烙懦。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像赤炒,于是被迫代替她去往敵國和親氯析。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容