函數(shù)是組織好的,可重復(fù)使用的,用來實(shí)現(xiàn)單一,或相關(guān)聯(lián)功能的代碼段。
包括:內(nèi)置函數(shù) 和 自定義函數(shù)。
定義:
def 函數(shù)名([參數(shù)]):
代碼塊
[return 表達(dá)式]
調(diào)用
函數(shù)名([參數(shù)])
根據(jù)是否有參數(shù)和是否有返回值,函數(shù)分為4種類型:
1、無參,無返回值
2、有參,無返回值
3、無參,有返回值
4、有參,有返回值
而參數(shù)可以分為以下五種:
1、可變和不可變參數(shù)
①不可變類型:
類似 c++ 的值傳遞,如 整數(shù)、字符串、元組。如fun(a),傳遞的只是a的值,沒有影響a對(duì)象本身。比如在 fun(a)內(nèi)部修改 a 的值,只是修改另一個(gè)復(fù)制的對(duì)象,不會(huì)影響 a 本身。
②可變類型:
類似 c++ 的引用傳遞,如 列表,字典。如 fun(ls),則是將ls 真正的傳過去,修改后fun外部的ls也會(huì)受影響。
2、必選參數(shù)
必選參數(shù)須以正確的順序傳入函數(shù)。調(diào)用時(shí)的數(shù)量必須和聲明時(shí)的一樣。
3、默認(rèn)參數(shù)
調(diào)用函數(shù)時(shí),缺省參數(shù)的值如果沒有傳入,則被認(rèn)為是默認(rèn)值。
4、可變參數(shù)
①在Python函數(shù)中,還可以定義可變參數(shù)。顧名思義,可變參數(shù)就是傳入的參數(shù)個(gè)數(shù)是可變的,可以是1個(gè)、2個(gè)到任意個(gè),還可以是0個(gè)。參數(shù)組裝成一個(gè)tutple。
②變參數(shù)允許你傳入0個(gè)或任意個(gè)參數(shù),這些可變參數(shù)在函數(shù)調(diào)用時(shí)自動(dòng)組裝為一個(gè)tuple。而關(guān)鍵字參數(shù)允許你傳入0個(gè)或任意個(gè)含參數(shù)名的參數(shù),這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部自動(dòng)組裝為一個(gè)dict。
5、關(guān)鍵字參數(shù)
對(duì)于關(guān)鍵字參數(shù),函數(shù)的調(diào)用者可以傳入任意不受限制的關(guān)鍵字參數(shù)。至于到底傳入了哪些,就需要在函數(shù)內(nèi)部通過kw檢查。
注意:如果要限制關(guān)鍵字參數(shù)的名字,就可以用命名關(guān)鍵字參數(shù)。
在Python中定義函數(shù),可以用必選參數(shù)、默認(rèn)參數(shù)、可變參數(shù)、關(guān)鍵字參數(shù)和命名關(guān)鍵字參數(shù),這5種參數(shù)都可以組合使用。
但是請(qǐng)注意,參數(shù)定義的順序必須是:必選參數(shù)、默認(rèn)參數(shù)、可變參數(shù)。
變量作用域
一個(gè)程序的所有的變量并不是在哪個(gè)位置都可以訪問的。訪問權(quán)限決定于這個(gè)變量是在哪里賦值的。
變量的作用域決定了在哪一部分程序你可以訪問哪個(gè)特定的變量名稱。兩種最基本的變量作用域有:全局變量 和 局部變量。
1、局部變量
①局部變量,就是在函數(shù)內(nèi)部定義的變量。
②不同的函數(shù),可以定義相同的名字的局部變量,但是各用個(gè)的不會(huì)產(chǎn)生影響。
③局部變量的作用,為了臨時(shí)保存數(shù)據(jù)需要在函數(shù)中定義變量來進(jìn)行存儲(chǔ),這就是它的作用。
④如果全局變量的名字和局部變量的名字相同,那么使用的是局部變量。
2、全局變量
①如果一個(gè)變量,既能在一個(gè)函數(shù)中使用,也能在其他的函數(shù)中使用,這樣的變量就是全局變量。
②如果要再函數(shù)中修改全局變量,使用global聲明。
小結(jié):
在函數(shù)外邊定義的變量叫做全局變量。
全局變量能夠在所以的函數(shù)中進(jìn)行訪問。
如果在函數(shù)中修改全局變量,那么就需要使用global進(jìn)行聲明。
如果全局變量的名字和局部變量的名字相同,那么使用的是局部變量的。
遞歸函數(shù)
如果一個(gè)函數(shù)在內(nèi)部不調(diào)用其它的函數(shù),而是自己本身的話,這個(gè)函數(shù)就是遞歸函數(shù)。
滿足遞歸的條件:
1、有循環(huán)的內(nèi)容
2、有跳出的條件
3、遞歸默認(rèn)是有遞歸深度要求的。
>>> import sys
>>> sys.getrecursionlimit()
1000
當(dāng)遞歸深度超過這個(gè)值的時(shí)候,就會(huì)引發(fā)這樣的一個(gè)異常。
解決的方式是手工設(shè)置遞歸調(diào)用深度,方式為
import sys
sys.setrecursionlimit(1000000) #例如這里設(shè)置為一百萬
例子:
斐波那契數(shù)列 迭代求法
1 1 2 3 5 8 13 21 34 55
def fun(n):
n1=1
n2=1
n3=1
if n<1:
print('輸入錯(cuò)誤!')
return -1
while (n-2)>0:
n3=n1+n2
n1=n2
n2=n3
n-=1
return n3
num=int(input('請(qǐng)輸入第幾個(gè)數(shù)'))
a=fun(num)
print('第%d個(gè)數(shù)字為:%d'%(num,a))
總結(jié):
使用遞歸要注意的有兩點(diǎn):
1、遞歸就是在過程或函數(shù)里面調(diào)用自身。
2、在使用遞歸時(shí),必須有一個(gè)明確的遞歸結(jié)束條件,稱為遞歸出口。
遞歸分為兩個(gè)階段:
1、遞推:把復(fù)雜的問題的求解推到比原問題簡單一些的問題的求解
2、回歸:當(dāng)獲得最簡單的情況后,逐步返回,依次得到復(fù)雜的解.
迭代:利用變量的原值推算出變量的一個(gè)新值.如果遞歸是自己調(diào)用自己的話,迭代就是A不停的調(diào)用B。
遞歸中一定有迭代,但是迭代中不一定有遞歸,大部分可以相互轉(zhuǎn)換。能用迭代的不用遞歸,遞歸調(diào)用函數(shù),浪費(fèi)空間,并且遞歸太深容易造成堆棧的溢出,使用的時(shí)候要慎重。
匿名函數(shù)
用lambda關(guān)鍵詞能創(chuàng)建小型匿名函數(shù)。這種函數(shù)得名于省略了用def聲明函數(shù)的標(biāo)準(zhǔn)步驟。
一般,執(zhí)行一次,或者作為參數(shù)傳遞。省的定義再調(diào)用。直接定義加調(diào)用。
lambda函數(shù)的語法只包含一個(gè)語句,如下:
lambda [arg1 [,arg2,.....argn]]:expression
注意:
Lambda函數(shù)能接收任何數(shù)量的參數(shù)但只能返回一個(gè)表達(dá)式的值。