一、函式
def
functionname
(parameters)
:"函式_文件字串"
function_suite
return
[expression]
2、函式的呼叫
python內建了很多有用的函式,我們可以直接呼叫。
要呼叫乙個函式,需要知道函式的名稱和引數,比如求絕對值的函式abs,只有乙個引數。
>>
>
abs(-20
)20
呼叫函式的時候,如果傳入的引數數量不對,會報typeerror的錯誤,並且python會明確地告訴你:abs()有且僅有1個引數,但你給出了兩個;
如果傳入的引數數量是對的,但引數型別不能被函式所接受,也會報typeerror的錯誤,並且給出錯誤資訊:str是錯誤的引數型別;
3、函式引數
python 的函式具有非常靈活多樣的引數形態,既可以實現簡單的呼叫,又可以傳入非常複雜的引數。從簡到繁的引數形態如下:
位置引數 (positional argument)
預設引數 (default argument)
可變引數 (variable argument)
關鍵字引數 (keyword argument)
命名關鍵字引數 (name keyword argument)
引數組合
(1)位置引數:arg1 - 位置引數 ,這些引數在呼叫函式 (call function) 時位置要固定。
def
functionname
(arg1)
:"函式_文件字串"
function_suite
return
[expression]
對於power(x)函式,引數x就是乙個位置引數。當我們呼叫power函式時,必須傳入有且僅有的乙個引數x:
def
power
(x):
return x * x
(2)預設引數
def
functionname
(arg1, arg2=v)
:"函式_文件字串"
function_suite
return
[expression]
arg2 = v - 預設引數 = 預設值,呼叫函式時,預設引數的值如果沒有傳入,則被認為是預設值。
設定預設引數時,有幾點要注意:
一是必選引數在前,預設引數在後,否則python的直譯器會報錯(思考一下為什麼預設引數不能放在必選引數前面);
二是如何設定預設引數。
當函式有多個引數時,把變化大的引數放前面,變化小的引數放後面。變化小的引數就可以作為預設引數。
使用預設引數有什麼好處?最大的好處是能降低呼叫函式的難度。
定義預設引數要牢記一點:預設引數必須指向不變物件!
(3)、可變引數:顧名思義,可變引數就是傳入的引數個數是可變的,可以是 0, 1, 2 到任意個,是不定長的引數。
def
functionname
(arg1, arg2=v,
*args)
:"函式_文件字串"
function_suite
return
[expression]
*args - 可變引數,可以是從零個到任意個,自動組裝成元組。
加了星號(*)的變數名會存放所有未命名的變數引數。
定義可變引數和定義乙個list或tuple引數相比,僅僅在引數前面加了乙個*號。在函式內部,引數numbers接收到的是乙個tuple,因此,函式**完全不變。但是,呼叫該函式時,可以傳入任意個引數,包括0個引數。
(4)、關鍵字引數
def
functionname
(arg1, arg2=v,
*args,
**kw)
:"函式_文件字串"
function_suite
return
[expression]
**kw - 關鍵字引數,可以是從零個到任意個,自動組裝成字典。可變引數允許你傳入0個或任意個引數,這些可變引數在函式呼叫時自動組裝為乙個tuple。而關鍵字引數允許你傳入0個或任意個含引數名的引數,這些關鍵字引數在函式內部自動組裝為乙個dict。
(5)命名關鍵字引數
def
functionname
(arg1, arg2=v,
*args,
*, nkw,
**kw)
:"函式_文件字串"
function_suite
return
[expression]
*, nkw - 命名關鍵字引數,使用者想要輸入的關鍵字引數,定義方式是在nkw 前面加個分隔符 *。*後面的引數被視為命名關鍵字引數。
如果要限制關鍵字引數的名字,就可以用「命名關鍵字引數」
使用命名關鍵字引數時,要特別注意不能缺少引數名,否則將報錯。
如果函式定義中已經有了乙個可變引數,後面跟著的命名關鍵字引數就不再需要乙個特殊分隔符*了
(6)引數組合
在python中定義函式,可以用必選引數、預設引數、可變引數、關鍵字引數和命名關鍵字引數,這5種引數都可以組合使用。但是請注意,引數定義的順序必須是:必選引數、預設引數、可變引數、命名關鍵字引數和關鍵字引數。
要注意定義可變引數和關鍵字引數的語法:
*args 是可變引數,args 接收的是乙個 tuple
**kw 是關鍵字引數,kw 接收的是乙個 dict
雖然可以組合多達5種引數,但不要同時使用太多的組合,否則函式介面的可理解性很差。
4、變數作用域
python 中,程式的變數並不是在哪個位置都可以訪問的,訪問許可權決定於這個變數是在**賦值的。
定義在函式內部的變數擁有區域性作用域,該變數稱為區域性變數。
定義在函式外部的變數擁有全域性作用域,該變數稱為全域性變數。
區域性變數只能在其被宣告的函式內部訪問,而全域性變數可以在整個程式範圍內訪問。
二、遞迴函式
在函式內部,可以呼叫其他函式。如果乙個函式在內部呼叫自身本身,這個函式就是遞迴函式。
def
fact
(n):
if n==1:
return
1return n * fact(n -
1)
遞迴函式的優點是定義簡單,邏輯清晰。理論上,所有的遞迴函式都可以寫成迴圈的方式,但迴圈的邏輯不如遞迴清晰。
使用遞迴函式需要注意防止棧溢位。在計算機中,函式呼叫是通過棧(stack)這種資料結構實現的,每當進入乙個函式呼叫,棧就會加一層棧幀,每當函式返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞迴呼叫的次數過多,會導致棧溢位。
解決遞迴呼叫棧溢位的方法是通過尾遞迴優化,事實上尾遞迴和迴圈的效果是一樣的,所以,把迴圈看成是一種特殊的尾遞迴函式也是可以的。
尾遞迴是指,在函式返回的時候,呼叫自身本身,並且,return語句不能包含表示式。這樣,編譯器或者直譯器就可以把尾遞迴做優化,使遞迴本身無論呼叫多少次,都只占用乙個棧幀,不會出現棧溢位的情況。
三、 lambda 表示式
lambda argument_list: expression
odd =
lambda x: x %2==
1templist =
filter
(odd,[1
,2,3
,4,5
,6,7
,8,9
])print
(list
(templist)
)# [1, 3, 5, 7, 9]
map(function, iterable, …) 根據提供的函式對指定序列做對映。
m1 =
map(
lambda x: x **2,
[1,2
,3,4
,5])
print
(list
(m1)
)# [1, 4, 9, 16, 25]
m2 =
map(
lambda x, y: x + y,[1
,3,5
,7,9
],[2
,4,6
,8,10
])print
(list
(m2)
)# [3, 7, 11, 15, 19]
強迫自己學習
你要經常鼓勵那些為你工作的人繼續進修。但是請相信我,為此,你會遭遇很 多的反對。人人都說,教育訓練很重要,然而一旦到了要接受訓練的時候,各式各樣的藉口就都出籠了 我沒有空 這很浪費時間 下次再說 以及其 它更有創意的回答。不要管這些藉口,就是要他們付諸行動。訓練和教育,可以打造更好的人才 更好的人才...
python20 函式和檔案
直接上 注意下函式是如何與檔案相結合ex20.py from sys import argv script,input file argv def print all f print f.read def rewind f f.seek 0 def print a line line count,f...
Python教程之Python2 0簡介
python 是乙個高層次的結合了解釋性 編譯性 互動性和物件導向的指令碼語言。python 的設計具有很強的可讀性,相比其他語言經常使用英文關鍵字,其他語言的一些標點符號,它具有比其他語言更有特色語法結構。python 是一種解釋型語言 這意味著開發過程中沒有了編譯這個環節。類似於php和perl...