函數

函數是組織好的,可重復使用的,用來實現單一,或相關聯功能的代碼段。
包括:內置函數 和 自定義函數。

定義:
def  函數名([參數]):
    代碼塊
    [return 表達式]
調用
函數名([參數])

根據是否有參數和是否有返回值,函數分為4種類型:
1、無參,無返回值
2、有參,無返回值
3、無參,有返回值
4、有參,有返回值

而參數可以分為以下五種:

1、可變和不可變參數
①不可變類型:
類似 c++ 的值傳遞,如 整數、字符串、元組。如fun(a),傳遞的只是a的值,沒有影響a對象本身。比如在 fun(a)內部修改 a 的值,只是修改另一個復制的對象,不會影響 a 本身。
②可變類型:
類似 c++ 的引用傳遞,如 列表,字典。如 fun(ls),則是將ls 真正的傳過去,修改后fun外部的ls也會受影響。

2、必選參數
必選參數須以正確的順序傳入函數。調用時的數量必須和聲明時的一樣。

3、默認參數
調用函數時,缺省參數的值如果沒有傳入,則被認為是默認值。

4、可變參數
①在Python函數中,還可以定義可變參數。顧名思義,可變參數就是傳入的參數個數是可變的,可以是1個、2個到任意個,還可以是0個。參數組裝成一個tutple。
②變參數允許你傳入0個或任意個參數,這些可變參數在函數調用時自動組裝為一個tuple。而關鍵字參數允許你傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝為一個dict。

5、關鍵字參數
對于關鍵字參數,函數的調用者可以傳入任意不受限制的關鍵字參數。至于到底傳入了哪些,就需要在函數內部通過kw檢查。
注意:如果要限制關鍵字參數的名字,就可以用命名關鍵字參數。

在Python中定義函數,可以用必選參數、默認參數、可變參數、關鍵字參數和命名關鍵字參數,這5種參數都可以組合使用。
但是請注意,參數定義的順序必須是:必選參數、默認參數、可變參數。

變量作用域

一個程序的所有的變量并不是在哪個位置都可以訪問的。訪問權限決定于這個變量是在哪里賦值的。
變量的作用域決定了在哪一部分程序你可以訪問哪個特定的變量名稱。兩種最基本的變量作用域有:全局變量 和 局部變量。

1、局部變量
①局部變量,就是在函數內部定義的變量。
②不同的函數,可以定義相同的名字的局部變量,但是各用個的不會產生影響。
③局部變量的作用,為了臨時保存數據需要在函數中定義變量來進行存儲,這就是它的作用。
④如果全局變量的名字和局部變量的名字相同,那么使用的是局部變量。

2、全局變量
①如果一個變量,既能在一個函數中使用,也能在其他的函數中使用,這樣的變量就是全局變量。
②如果要再函數中修改全局變量,使用global聲明。

小結:
在函數外邊定義的變量叫做全局變量。
全局變量能夠在所以的函數中進行訪問。
如果在函數中修改全局變量,那么就需要使用global進行聲明。
如果全局變量的名字和局部變量的名字相同,那么使用的是局部變量的。

遞歸函數

如果一個函數在內部不調用其它的函數,而是自己本身的話,這個函數就是遞歸函數。
滿足遞歸的條件:
1、有循環的內容
2、有跳出的條件
3、遞歸默認是有遞歸深度要求的。

>>> import sys
>>> sys.getrecursionlimit()
1000

當遞歸深度超過這個值的時候,就會引發這樣的一個異常。
解決的方式是手工設置遞歸調用深度,方式為
 
import sys   
sys.setrecursionlimit(1000000) #例如這里設置為一百萬

例子:
斐波那契數列 迭代求法
1 1 2 3 5 8 13 21 34 55

def fun(n):
    n1=1
    n2=1
    n3=1
    if n<1:
        print('輸入錯誤!')
        return -1
    while (n-2)>0:
        n3=n1+n2
        n1=n2
        n2=n3
        n-=1
    return n3
num=int(input('請輸入第幾個數'))
a=fun(num)
print('第%d個數字為:%d'%(num,a))

總結:
使用遞歸要注意的有兩點:
1、遞歸就是在過程或函數里面調用自身。
2、在使用遞歸時,必須有一個明確的遞歸結束條件,稱為遞歸出口。
遞歸分為兩個階段:
1、遞推:把復雜的問題的求解推到比原問題簡單一些的問題的求解
2、回歸:當獲得最簡單的情況后,逐步返回,依次得到復雜的解.

迭代:利用變量的原值推算出變量的一個新值.如果遞歸是自己調用自己的話,迭代就是A不停的調用B。

遞歸中一定有迭代,但是迭代中不一定有遞歸,大部分可以相互轉換。能用迭代的不用遞歸,遞歸調用函數,浪費空間,并且遞歸太深容易造成堆棧的溢出,使用的時候要慎重。

匿名函數

用lambda關鍵詞能創建小型匿名函數。這種函數得名于省略了用def聲明函數的標準步驟。
一般,執行一次,或者作為參數傳遞。省的定義再調用。直接定義加調用。
lambda函數的語法只包含一個語句,如下:

lambda [arg1 [,arg2,.....argn]]:expression

注意:
Lambda函數能接收任何數量的參數但只能返回一個表達式的值。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容