Python基礎篇--函式簡介
python函式
python中函式有兩種,一種是內建函式,一種是自定義函式。這裡不曉得有沒有大牛知道為什麼內建函式可以直接呼叫,沒見在哪裡定義了。另外一種是自定義函式,函式的定義方式如下,關鍵字def後面跟空格,再跟函式名,引數,函式體,函式名的命名可以使用posix命名或者小駝峰命名,函式定義了,但是不會自發執行函式體中的內容,只有在程式中顯示的呼叫了函式才會執行函式體中的內容。
定義函式
def func(params): #必須帶:並且:後面必須為程式碼塊,切程式碼塊不能為空
pass
呼叫函式
func(needParams) #呼叫函式直接用函式的方法名即可,且當引數不是收集引數時,實參必填
函式中引數的作用域
對於全域性變數,函式可以自行呼叫,但是函式內部的變數則只能在內部使用,除非定義成全域性變數,globals()和locals()為 兩個內建函式,呼叫他們會返回全域性引數的字典和區域性引數的字典。對於變數,沒有做特殊定義,只能區域性變數在區域性和 其內部呼叫,總之是隻能從裡面訪問外面不能從外面訪問裡面。例外:函式內部的變數可以用global宣告成全域性變數
函式中的引數:
·普通引數:就是一般的引數,可以根據位置來傳參也可以通過關鍵字來傳參
def commonArgs(name,age):pass
commonArgs('zhangsan',20) or commonArgs(name = 'lisi' ,20)
·預設引數:也叫關鍵字引數,在定義函式時候給引數一個預設的值,所以這個引數可以傳參也可不傳參,
def defaultArgs(name,age = 18):pass
defaultArgs('zhangsan') or defaultArgs('zhangsan',age = 20)
·收集引數:在不確定有多少個傳入引數的時候可以使用收集引數,收集引數又分普通收集引數和關鍵字收集引數
def collectionCArgs(*args):pass #普通收集引數 def collectionDArgs(**args):pass #關鍵字收集引數
collectionCArgs() or collectionCArgs('1',1) collectionDArgs() or collectionDArgs(name ='1',age=2)
對於引數,用的最多的是混合使用,混合使用引數,一定是普通引數在前面,預設引數(關鍵字引數)在後面,當普通收集引數後面有普通引數時,給這個 普通引數傳值一定要用關鍵字傳值,
def egArgs(name,age,*args,hobby,sex='man',**othArgs,like = 'dodo'):pass
在這個函式中,前面都是普通引數,從sex引數後面都是關鍵字引數,順序不能錯,且給在收集引數後面的引數傳值時一定要用關鍵字傳值
egArgs('張三',18,1,2,'33',hobby='jump',height='180',like='toto')
遞迴函式:函式的自我呼叫,優點:程式碼邏輯清晰,更貼近邏輯 。缺點:消耗效能,
在python中,函式的遞迴不會導致程式崩潰,但是會丟擲異常,python中限制了遞迴的深度,常見的遞迴有斐波拉契數列,二分查詢演算法,八皇后問題,漢諾塔問題,下面我就簡單的寫下漢諾塔的遞迴呼叫(虛擬碼),對於漢諾塔遊戲有不清楚的可以自己去百度下怎麼玩
設計原型:柱子A,柱子B,柱子C ,碟子 n(不確定的正整數)
把n個碟子從A -> C ,對於這樣的問題,看起來很複雜,其實需要我們一層層的揭開就好理解了,就像高中數學,我們從一般推理出特殊,假定只有2個盤子,我們的做法是 A->B, A->C, B->C, 那麼如果有三個盤子呢? 我們做法其實也三步 1:把A上的兩個盤子移到b上,2:把A上的最後一個盤子移到C上,3:把B上的兩個盤子移到C上,
那麼現在假定有n個 def gameNuo(n,A,B,C): 要把n個盤子從A移動到C藉助B
1:把n-1個盤子從A移動到B藉助C gameNuo(n-1,A,C,B)
2:把A上的一個盤子移動到C上
3:把B上的n-1個盤子移動到C上藉助A gameNuo(n-1,B,A,C) ,至此盤子移動完畢,隨著n的減少,當n = 2時就按照已有的程式執行,這就是遞迴,根據特殊情況推出一般情況
def gameNuo(n,A,B,C):
if n == 1 :
print(A,'->',C)
gameNuo(n-1,A,C,B)
pring(A,'->',C)
gameNuo(n-1,B,A,C)