1. 程式人生 > >Python基礎篇--函式簡介

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)