分享幾個Python小技巧函數裏的4個小花招

前面講了不少內容都是關於python的變量,數據結構,下面咱們來談一談python的函數。python裏的函數知識點大概分爲基礎的定義使用做用域參數傳遞高級用法,其中參數傳遞最爲靈活,做用域最爲繞人.java


函數實際上是對程序邏輯進行結構化或者過程化的一種編程方法,把整塊的代碼巧妙的隔離成易於管理的小塊,是最基本的一種代碼抽象的方式。python

python函數是用def關鍵字定義的:c++

  • def算是函數的頭,頭上通常會有一個函數名,後面跟0個或者多個參數
  • 而後是函數的身體,這個代碼塊就是函數的主體部分,通常會縮進寫
  • 最後是函數的尾巴包含一個return語句,返回一個對象的表達式.

今天咱們先來講一說裏面的一些小花招,算是給初學者的開胃菜,爲後面正式講函數熱熱身:

1.Python函數能夠返回多個值

通常的編程語言好比c,c++,java,通常返回的都是一個值,python能夠返回多個值(perl其實也能夠),由於有的時候咱們除了須要函數返回計算的結果,咱們還須要返回一些操做的狀態,看個簡單的例子你就明白了 :express

分享幾個Python小技巧函數裏的4個小花招

這個getHtmlResponse()函數能夠返回多個值,第一值是返回處理的狀態True or false,第二值是msg,有的時候咱們須要先判斷狀態,若true 就無論了,如果false再進一步處理.編程

這樣的場景下用函數返回多個值這個特性很容易搞定.原理其實就是函數返回了一個元組,而後把結果賦值給多個變量。bash

說到這裏,我穿插一個小技巧,個人時候咱們但願丟棄掉一些返回值,數據結構

咱們能夠用_搞定(用一個幾乎用不到的變量名,來做爲要丟棄的值的名稱)編程語言

分享幾個Python小技巧函數裏的4個小花招

2.儘可能用異常表示特殊狀況,不要返回None

python函數若你什麼都不return,默認返回None,很容易忽視這一點函數

分享幾個Python小技巧函數裏的4個小花招

有的同窗說我寫函數代碼,會記得加上None,可是有的時候返回None也會讓你誤解,很差處理,你不信咱們看下面一個例子:spa

分享幾個Python小技巧函數裏的4個小花招

緣由是當分子爲0的時候,計算結果爲0,那這個結果去作條件判斷時,會出現問題,會弄巧成拙。其實你返回None是有特殊意義的,是爲了判斷分母爲0.

解決這個問題有兩個辦法:第一個是把返回值拆成兩部分,返回一個元組,第一個元素是操做是否成功,第二個是運行結果,改爲以下:

分享幾個Python小技巧函數裏的4個小花招

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

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

分享幾個Python小技巧函數裏的4個小花招

如今調用者就須要處理因輸入值無效而引起的異常,而不須要用條件語句去判斷函數的返回值,很是清晰並且不容易混淆.

3.匿名函數

python除了def語句以外,還提供了一中懶人專用的函數叫作lambda,有點LISP語言的風格

(LISP是一個很是著名的
黑客語言)
.因此稱爲lambda匿名函數,其實就想def同樣,這個表達式建立了一個可以調用的函數,它實際上是返回一個函數而不是像傳統的函數賦值給一個變量名,因此通常都是在一種 行內進行使用.

形式:

lambda arg1,arg2...argN:expression using arg
複製代碼
  • lambda是一個表達式,而不是一個語句

做爲一個表達式,常常在列表中或者函數中調用,可以出如今python語法不容許出現def的地方.此外作爲一個表達式lambda返回了一個值(新的函數),能夠選擇性的賦值給一個變量名。

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

lambda的主體簡單的就像放在def主體的return 裏的代碼同樣,寫成一個表達式,lambda一般比def功能要小,只能封裝一些有限的邏輯,lambda爲簡單任務而生,def則處理更大更復雜的任務.

對比一下吧:

  • 普通函數
分享幾個Python小技巧函數裏的4個小花招

  • 匿名函數
分享幾個Python小技巧函數裏的4個小花招

在好比在排序對數據整理時常常用到:

分享幾個Python小技巧函數裏的4個小花招

也許懶惰也是推動人類進步的一大利器,當年由於懶惰嫌Dos太麻煩纔有了win,當年的手機系統由於懶惰但願不用鍵盤直接手點點多好纔有了觸摸屏,由於懶惰懶的打字才推動了語音識別.

4.警戒默認參數的潛在問題

最後一個花招是很具備迷惑性的,必定要看仔細,通常咱們在函數參數傳遞的時候,但願用一種非靜態的類型來做爲關鍵字的默認值,好比咱們常常會有打印日誌消息的函數:

分享幾個Python小技巧函數裏的4個小花招

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

是否是以爲很冤枉,

明明想動態的一下的,反而變成了靜靜~~
腫麼辦

這裏有一個小技巧,在Python中若你想動態實現默認值,習慣把默認值改爲None,而後加一些註釋,看代碼吧:

分享幾個Python小技巧函數裏的4個小花招

如今兩條消息的時間戳就不一樣了,若是參數的實際默認值是可變類型,切記切記用None做爲形式上的默認值.

好了函數裏的小花招就講到這裏啦,但願能給初學者一些啓發,如有什麼不懂的,也能夠留言跟我探討交流.

相關文章
相關標籤/搜索