日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Python函數(shù)里的4個小花招

 Four兄 2019-08-24

前面講了很多內(nèi)容都是關(guān)于python的變量,數(shù)據(jù)結(jié)構(gòu),下面我們來談一談python的函數(shù)。python里的函數(shù)知識點大概分為基礎(chǔ)的定義使用,作用域參數(shù)傳遞,高級用法,其中參數(shù)傳遞最為靈活,作用域最為繞人.

函數(shù)其實是對程序邏輯進(jìn)行結(jié)構(gòu)化或者過程化的一種編程方法,把整塊的代碼巧妙的隔離成易于管理的小塊,是最基本的一種代碼抽象的方式。

python函數(shù)是用def關(guān)鍵字定義的:

  • def算是函數(shù)的頭,頭上一般會有一個函數(shù)名,后面跟0個或者多個參數(shù)

  • 然后是函數(shù)的身體,這個代碼塊就是函數(shù)的主體部分,一般會縮進(jìn)寫

  • 最后是函數(shù)的尾巴包含一個return語句,返回一個對象的表達(dá)式.

今天我們先來說一說里面的一些小花招,算是給初學(xué)者的開胃菜,為后面正式講函數(shù)熱熱身:

1.Python函數(shù)可以返回多個值

一般的編程語言比如c,c++,java,一般返回的都是一個值,python可以返回多個值(perl其實也可以),因為有的時候我們除了需要函數(shù)返回計算的結(jié)果,我們還需要返回一些操作的狀態(tài),看個簡單的例子你就明白了 :


這個getHtmlResponse()函數(shù)可以返回多個值,第一值是返回處理的狀態(tài)True or false,第二值是msg,有的時候我們需要先判斷狀態(tài),若true 就不管了,若是false再進(jìn)一步處理.

這樣的場景下用函數(shù)返回多個值這個特性很容易搞定.原理其實就是函數(shù)返回了一個元組,然后把結(jié)果賦值給多個變量。

說到這里,我穿插一個小技巧,我的時候我們希望丟棄掉一些返回值,

我們可以用_搞定(用一個幾乎用不到的變量名,來作為要丟棄的值的名稱)

def getRoomData():

return 'class room is 203',1000,'2016-10-06'

_,price,_=getData()

print price

>>1000

2.盡量用異常表示特殊情況,不要返回None

python函數(shù)若你什么都不return,默認(rèn)返回None,很容易忽視這一點

def addFun(a,b):

sum=a+b

print addFun(10,20)

>>None

有的同學(xué)說我寫函數(shù)代碼,會記得加上None,但是有的時候返回None也會讓你誤解,不好處理,你不信我們看下面一個例子:


原因是當(dāng)分子為0的時候,計算結(jié)果為0,那這個結(jié)果去做條件判斷時,會出現(xiàn)問題,會弄巧成拙。其實你返回None是有特殊意義的,是為了判斷分母為0.

解決這個問題有兩個辦法:第一個是把返回值拆成兩部分,返回一個元組,第一個元素是操作是否成功,第二個是運(yùn)行結(jié)果,改成如下:

def divide(a,b):

try:

return True,a/b

except ZeroDivisionError:

return False,None

print (divide(0,10))

>>(True, 0)

第二個好的辦法是:根本不返回None,直接拋異常給上一級,使得調(diào)用者必須應(yīng)對它,好我們來改一下代碼看看:

#異常部分后面會講,valueError是異常中的一種,表示傳給函數(shù)的參數(shù)類型不正確


現(xiàn)在調(diào)用者就需要處理因輸入值無效而引發(fā)的異常,而不需要用條件語句去判斷函數(shù)的返回值,非常清晰而且不容易混淆.

3.匿名函數(shù)

python除了def語句之外,還提供了一中懶人專用的函數(shù)叫做lambda,有點LISP語言的風(fēng)格(LISP是一個非常著名的黑客語言).所以稱為lambda匿名函數(shù),其實就想def一樣,這個表達(dá)式創(chuàng)建了一個能夠調(diào)用的函數(shù),它其實是返回一個函數(shù)而不是像傳統(tǒng)的函數(shù)賦值給一個變量名,所以一般都是在一種行內(nèi)進(jìn)行使用.

形式:

lambda arg1,arg2...argN:expression using arg

  • lambda是一個表達(dá)式,而不是一個語句

作為一個表達(dá)式,經(jīng)常在列表中或者函數(shù)中調(diào)用,能夠出現(xiàn)在python語法不允許出現(xiàn)def的地方.此外做為一個表達(dá)式lambda返回了一個值(新的函數(shù)),可以選擇性的賦值給一個變量名。

  • lambda的主體是單個的表達(dá)式,而不是代碼塊

lambda的主體簡單的就像放在def主體的return 里的代碼一樣,寫成一個表達(dá)式,lambda通常比def功能要小,只能封裝一些有限的邏輯,lambda為簡單任務(wù)而生,def則處理更大更復(fù)雜的任務(wù).

對比一下吧:

  • 普通函數(shù)

def addFunc(x,y,z):

return x+y+z 

print addFunc(1,2,3)

>>6

  • 匿名函數(shù)

f=lambda x,y,z:x+y+z

print f(1,2,3)

>>6

在比如在排序?qū)?shù)據(jù)整理時經(jīng)常用到:

names=['David Bea','Zrian Aones','Raymond Het']

print sorted(names,key=lambda name:name.split()[-1].lower())

>>['Zrian Aones', 'David Bea', 'Raymond Het']

也許懶惰也是推進(jìn)人類進(jìn)步的一大利器,當(dāng)年因為懶惰嫌Dos太麻煩才有了win,當(dāng)年的手機(jī)系統(tǒng)因為懶惰希望不用鍵盤直接手點點多好才有了觸摸屏,因為懶惰懶的打字才推進(jìn)了語音識別.

4.警惕默認(rèn)參數(shù)的潛在問題

最后一個花招是很具有迷惑性的,一定要看仔細(xì),一般我們在函數(shù)參數(shù)傳遞的時候,希望用一種非靜態(tài)的類型來作為關(guān)鍵字的默認(rèn)值,比如我們經(jīng)常會有打印日志消息的函數(shù):



奇怪兩條消息戳是一樣的,這是因為datetime.datetime.now()只執(zhí)行了一次,也就是說在函數(shù)定義的時候執(zhí)行了一次。參數(shù)的默認(rèn)值會在每一個模塊加載進(jìn)來的時候求出,一旦這段模塊加載進(jìn)來了,參數(shù)的默認(rèn)值就很固定了,程序不會再出執(zhí)行datetime.datetime.now()

 是不是覺得很冤枉,明明想動態(tài)的一下的,反而變成了靜靜~~ 腫么辦

 這里有一個小技巧,在Python中若你想動態(tài)實現(xiàn)默認(rèn)值,習(xí)慣把默認(rèn)值改成None,然后加一些注釋,看代碼吧:


現(xiàn)在兩條消息的時間戳就不同了,如果參數(shù)的實際默認(rèn)值是可變類型,切記切記用None作為形式上的默認(rèn)值.

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多