1.定義函數
def max(x,y): if x>y: return x else: return y
如果定義空函數(函數還沒想好怎么編寫,只是為了讓整個代碼能夠運行起來)
def max(x,y): pass
2.函數的參數
2.1可變參數
顧名思義參數是可變的,既可以是1個參數,也可以是多個參數
例:請計算a^2+ b^2 + c^2 + ……,其中a,b,c.....個數不確定,所以我們將參數用一個list或tuple傳進去
def calc(numbers): sum =0 for i in numbers: sum = sum + i*i return sum
調用時
calc([1,2,3]) #list作為輸入,輸出為14
calc((1,2,4)) #tuple作為輸入,輸出為21
如果想將list或者tuple的參數,改為可變參數,代碼如下:
def calc(*numbers): #只需要在numbers前面加* sum =0 for i in numbers: sum = sum + i*i return sum
調用時 calc(1,2,3) #輸出14
與前面的定義只是多了個*,可變參數numbers在函數內封裝成tuple類型。
也可以先組建一個list,num=[1,9,10,4] ,再把list參數作為可變參數傳進去,此時運用可變參數調用時,需要這么寫calc(*num)
或者 calc(num[0],num[1],num[2],num[3])
2.2關鍵字參數
關鍵字參數,在函數內部封裝成dict類型,定義時會用**標記
例如:
def one(name,sex,**kw): PRint 'name:',name,'sex:',sex,'other:',kw # , 表示輸出一個空格,注:python的單引號與雙引號使用沒什么區別。
小技巧:str='my name is "boy" ' 或者 str="my name is 'boy' "
調用時:
one(Tom,boy,city='beijing') 輸出為name: Tom sex: boy others: {'city':'beijing'}
one(Tom,boy,city='beijing',job='teacher') 輸出 name: Tom sex: boy others: {'city':'beijing','job':'teacher'}
和可變參數類似,也可以先組建一個dict,再把dict轉換為關鍵字參數傳進去,例:
dict={'city':'beijing','job':'teacher'} 調用時用法為one(Tom,boy,**dict); 或者 one(Tom,boy,city=dict['city'],job=dict['job'])
3.遞歸函數
3.1遞歸舉例
例子,計算n!
def fact(n): if n =0: return 1 return n*fact(n-1)
遞歸函數的優點是定義簡單,邏輯清晰,但是容易出現棧溢出,在計算機中,函數調用是通過棧(stack)這種數據結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減少一層棧幀,由于棧的大小不是無限的,所以遞歸次數過多,會導致棧溢出
3.2尾遞歸優化遞歸函數
目的是為了防止棧溢出
def fact(n): return fact_iter(1,1,n)def fact_iter(pro,count,max): if count>max : return pro return fact_iter(pro*count,count+1,max)
尾遞歸調用時,如果做了優化,棧不會增長,因此,無論多少次調用也不會導致棧溢出。遺憾的是,大多數編程語言沒有針對尾遞歸做優化,python解釋器也沒有做優化,所以,即使上面的fact(n)函數改成尾遞歸方式,也會導致棧溢出。
新聞熱點
疑難解答