首頁 > 軟體

python中的函數巢狀和巢狀呼叫

2022-06-28 14:02:22

函數巢狀和巢狀呼叫

函數的巢狀

函數的巢狀:在函數裡面還有函數。分為外函數和內函數。

巢狀函數是為函數內部服務的,比如減少程式碼的重複,想要呼叫函數,要使用函數名,內函數也一樣。如果不用函數名呼叫內函數,內函數就永遠不會執行。

內函數的呼叫

怎麼在函數外部呼叫內函數呢?首先,不能直接呼叫內函數 ,需要先執行外函數的程式碼塊。

def func1():
    print("這是外部函數")
    def func2():
        print("這是內部函數")
func2()  

沒有執行外函數內部的程式碼塊,python找不到內函數,所以報name ‘func2’ is not defined,函數func2()沒有定義

有幾種方式可以實現對內函數的呼叫。

1.在外函數內部呼叫內函數,即用函數名呼叫

def func1():
    print("這是外部函數")
    def func2():
        print("這是內部函數")
    func2() #函數名呼叫內函數
func1() 

這樣呼叫外函數也會執行內函數的程式碼塊了

2.可以用return呼叫內函數

在使用return之前,需要說明一點:我們都是使用"函數名()“呼叫函數的方法,單獨使用"函數名”,我們會得到函數的記憶體地址;(函數名後面加括號才會告訴python,引數是否對得上,然後執行函數的程式碼塊。)

  • "return函數名()"呼叫內函數
def func1():
    print("這是外部函數")
    def func2():
        print("這是內部函數")
    return func2()
func1()

函數沒有返回值,即返回值為None,"return func2()"和"func2()"的效果是一樣的

def func1():
    print("這是外部函數")
    def func2():
        print("這是內部函數")
    return func2()
m = func1() #呼叫函數func1(),呼叫函數func2的方法
print(m)    #m為None
  • 外函數內部"return函數名",也可以呼叫內函數,只不過呼叫外函數時多加一個括號
def func1():
    print("這是外部函數")
    def func2():
        print("這是內部函數")
    return func2
m = func1() 
print(m)
# 
#執行結果為
這是外部函數
<function func1.<locals>.func2 at 0x0000000002EB6620>

上面可以看到,使用函數名得到的是函數的地址,我們可以用一個變數指向這個地址,相當於建立一個變數,這個變數指向的是函數的地址。因為只有函數名是不能呼叫函數的方法的,所以呼叫外函數時要用到雙括號。

def func1():
    print("這是外部函數")
    def func2():
        print("這是內部函數")
    return func2
func1()() ##執行func1()會返回func2然後再func2()
# m = func1()
# m()

我們可以用func1()返回一個函數func2,再加一個括號呼叫內函數的方法。

小結:想要呼叫內函數,首先要呼叫外函數,即執行外函數的程式碼塊,才有內函數呼叫的環境。在外函數內部,可以用函數名呼叫內函數。也可以用return呼叫內函數,如果return是函數本身的地址,呼叫外函數時會用到雙括號,先呼叫func1()得到func2然後再func2()。如果return func2(),那麼和func2()是一樣的,都是告訴python呼叫內函數。

變數的作用範圍

外函數裡面的變數和內函數裡面的變數是有區別的,作用範圍不一樣。內函數也可以使用外函數的變數,但是如果想要在內部函數修改外部函數變數的值,就要使用關鍵字nonlocal

def func1():
    b = 2
    def func2():
        nonlocal b
        b = b - 1
    func2()
    print(b)

函數的巢狀呼叫

在一個函數裡面呼叫別的函數

def print1():
    print("這是第一個函數")
def print2():
    print("這是定義的第二個函數")
    print1() #在print2()中呼叫print1()
print2()

函數中定義函數

在函數內部定義的函數要在函數內部呼叫

def paint():
    print("paint")
    def paintA():
        print("paintA")
    paintA()
paint()
//輸出如下:
//paint
//paintA

在函數外部呼叫函數的結果如下

paintA    //試圖在函數外部呼叫paintA()
//以下是報錯資訊
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-15-1a59d6e3eeb5> in <module>()
      5     paintA()
      6 paint()
----> 7 paintA

NameError: name 'paintA' is not defined

函數內的函數可以參照外部變數

但是不可以對其進行修改

a=6
def FuncX(x):
     def FuncY(y):
             return a*y
            // return x*y,這裡也可以寫這條語句進行測試,因為對於FuncY()來說,x也算外部變數,我這裡主要是為了突出外部變數這個概念
     return FuncY
FuncX(5)(6)//把5賦給x,6賦給y
//輸出結果如下:
36

試圖對外部變數進行修改

a=6
def FuncX(x):
     def FuncY(y):
            #global a    加上這條語句即可修改a的值
             a=a*y
             return a  #試圖修改 a 的值
           #return a=a*y   Python不允許返回賦值表示式,並不是因為修改a的原因,這裡更新一下
           #更新時間  2019.1.4                
     return FuncY
FuncX(5)(6)
//報錯資訊
UnboundLocalError: local variable 'a' referenced before assignment

函數怎麼修改外部變數的值的說明

對於全域性變數的修改,如果全域性變數是int或者str,那麼如果想要在函數中對函數變數進行修改,則需要先在函數內,宣告其為global或nonlocal,在進行修改, 如果是list或者dict則可以直接修改

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com