函數(shù)

函數(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á)式的值。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 原文地址:C語言函數(shù)調(diào)用棧(一)C語言函數(shù)調(diào)用棧(二) 0 引言 程序的執(zhí)行過程可看作連續(xù)的函數(shù)調(diào)用。當(dāng)一個(gè)函數(shù)執(zhí)...
    小豬啊嗚閱讀 4,972評(píng)論 1 19
  • 函數(shù)參數(shù)的默認(rèn)值 基本用法 在ES6之前,不能直接為函數(shù)的參數(shù)指定默認(rèn)值,只能采用變通的方法。 上面代碼檢查函數(shù)l...
    呼呼哥閱讀 3,708評(píng)論 0 1
  • 原文鏈接:https://github.com/EasyKotlin 值就是函數(shù),函數(shù)就是值。所有函數(shù)都消費(fèi)函數(shù),...
    JackChen1024閱讀 6,352評(píng)論 1 17
  • 目錄### 一、函數(shù)的定義二、自定義函數(shù)三、函數(shù)的工作原理和結(jié)構(gòu)化編程四、PHP變量的范圍五、聲明及應(yīng)用各種形式的...
    akon2016閱讀 1,137評(píng)論 1 1
  • 一轉(zhuǎn)眼,暑假過去一半了。昨天晚上和妞妞去看了《蜘蛛俠》,回來兩個(gè)人趴在被窩里,她玩她的狼人殺,我玩我的微信。...
    Ada秦小念閱讀 539評(píng)論 0 0

友情鏈接更多精彩內(nèi)容