標籤:Python函數基礎
函數基礎
簡單地說,一個函數就是一組Python語句的組合,它們可以在程式中運行一次或多次運行。Python中的函數在其他語言中也叫做過程或子常式,那麼這些被封裝起來的語句通過一個函數名稱來調用。
有了函數,我們可以在很大程度上減少複製及粘貼代碼的次數了(相信很多人在剛開始時都有這樣的體驗)。我們可以把相同的代碼提煉出來做成一個函數,在需要的地方只需要調用即可。那麼,這樣就提高了代碼的複用率了,整體代碼看起來比較簡練,沒有那麼臃腫了。
函數在Python中是最基本的程式結構,用來最大化地讓我們的代碼進行複用;與此同時,函數可以把一個錯綜複雜的系統分割為可管理的多個部分,簡化編程、代碼複用。
接下來我們看看什麼是函數,及函數該如何定義。有兩種方式可以進行函數的定義,分別是def
及lambda
關鍵字。
函數定義
先總結一下為什麼要使用函數?
- 代碼複用最大化及最小化冗餘代碼;
- 過程分解(拆解)。把一個複雜的任務拆解為多個小任務。
函數定義的文法為(使用def
關鍵字建立了一個函數對象,並把該對象賦值給了一個函數名稱。):
def func_name(arg1, arg2, arg3, ..., argN): statement return value
根據上面定義,可以簡單地描述為:Python中的函數是具有0個或多個參數,具有若干行語句並且具有傳回值(傳回值可有可無)的一個語句塊(注意縮排)。
那麼我們就定義一個比較簡單的函數,該函數沒有參數,進入ipython互動式環境:
In [1]: def hello(): ...: print(‘Leave me alone, the world‘) ...:
def
語句定義了一個函數,但是並不會調用該函數。我們在代碼中可以調用已定義的函數,在函數的名稱後面加上一對小括弧就可以調用,小括弧中還有可選的函數參數。接下來調用(執行)該函數。
In [2]: hello()Leave me alone, the world
我們發現hello()
函數並沒有return
語句,在Python中,如果沒有顯式的執行return
語句,那麼函數的傳回值預設為None
。
我們說過,定義函數有兩種形式,另外一種形式是使用lambda
來定義。使用lambda
定義的函數是匿名函數,這個我們在後面的內容進行講解,這裡暫且不表。
接下來我們看看一個帶參數的函數定義及調用:
>>> def intersect(seq1, seq2):... res = []... for x in seq1:... if x in seq2:... res.append(x)... return res... >>> s1 = ‘SPAM‘>>> s2 = ‘SCAM‘>>> intersect(s1, s2)[‘S‘, ‘A‘, ‘M‘]
這個例子主要作用是:傳入兩個列表,求它們的共同的元素。當我們調用該函數時,需要給此函數傳入兩個參數。這裡我們把s1傳遞給了函數體中的seq1,把s2傳遞給了seq2,然後把傳回值res返回給調用者。上面的示範中我們並沒有接收該函數的傳回值,如果在後面的代碼中需要用到該函數的傳回值,那麼可以把該函數的傳回值賦值給一個變數即可。如:
>>> result = intersect(s1, s2)>>> result[‘S‘, ‘A‘, ‘M‘]
針對上面的例子,可以使用前面文章中介紹過的列表推導式:
>>> [x for x in s1 if x in s2][‘S‘, ‘A‘, ‘M‘]
函數實戰
函數基礎就介紹到這裡,接下來上一個實際的小樣本,通過requests
庫查詢手機號的歸屬地資訊。如果系統沒有安裝requests包,使用pip或easy_install進行安裝:
pip install requests
代碼為(在ipython互動式環境中執行的該代碼):
In [1]: import requestsIn [2]: def phone(): ...: num = input(‘Enter your phone number>>> ‘) ...: api = ‘http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=‘ ...: r = requests.get(api + num.strip()) ...: if r.ok: ...: print(r.text) ...: r.close() ...: return None ...: In [3]: phone()Enter your phone number>>> 13651813235__GetZoneResult_ = { mts:‘1365181‘, province:‘上海‘, catName:‘中國移動‘, telString:‘13651813235‘,areaVid:‘29423‘,ispVid:‘3236139‘,carrier:‘上海移動‘}
上面樣本中的函數並沒有接收參數,接下來把該函數改造為帶參數的。代碼為:
In [4]: def phone(phone_num): ...: api = ‘http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=‘ ...: res = requests.get(api+phone_num) ...: if res.ok: ...: print(res.text) ...: res.close() ...: return None ...: In [5]: phone(‘13651813235‘)__GetZoneResult_ = { mts:‘1365181‘, province:‘上海‘, catName:‘中國移動‘, telString:‘13651813235‘,areaVid:‘29423‘,ispVid:‘3236139‘,carrier:‘上海移動‘}
總結:函數設計原則
- Coupling: use arguments for inputs and return for outputs
- Coupling: use global variables only when truly necessary
- Coupling: don‘t change mutable arguments unless the caller expects it
- Cohesion: each function should have a single, unified purpose
- Size: each function should be relatively small
- Coupling: avoid changing variables in another module file directly
Python函數基礎