1. 程式人生 > 其它 >Python 函式巢狀

Python 函式巢狀

技術標籤:Python筆記python

C語言中不能在函式裡面巢狀定義函式,但是在MATLAB和Python中可以在函式內部定義函式,下面用例項來說明。


編寫一個計算立方根的函式,由一個遞推公式,給定精度,計算滿足精度要求的立方根。


def rt(x):
    if x == 0.0:
        return 0.0
    guess = x
    while abs((guess**3-x) / x) >1e-6:
        guess = (2.0 - guess + x /guess**2) / 3
    return guess
print(rt(8))

在這裡插入圖片描述
把每一個功能封裝成函式後有:

def not_enough(guess,x):
    return abs((guess**3-x) / x) >1e-6

def go_on(guess,x):
    return (2.0 - guess + x /guess**2) / 3

def rt(x):
    if x ==0.0:
        return 0.0
    else:
        guess = x
    while not_enough(guess,x):
        guess = go_on(guess,x)
    return guess
print(rt(8))

這裡由一個問題就是,上述not_enough()和go_on()函式都是為了rt()定義的,但是此處外部的函式也能呼叫這兩個函式,可以將這兩個函式放入rt()函式內部:


def rt(x):
    def not_enough(guess, x):
        return abs((guess ** 3 - x) / x) > 1e-6
    def go_on(guess, x):
        return (2.0 - guess + x / guess ** 2) / 3
        
    if x ==0.0:
        return 0.0
    else:
        guess = x
    while not_enough(guess,x):
        guess = go_on(guess,x)
    return guess
print(rt(8))

不僅如此,內部函式可以直接訪問外部定義的變數和資料,上面的程式碼可以改為:

def rt(x):
    def not_enough():
        return abs((guess ** 3 - x) / x) > 1e-6
    def go_on():
        return (2.0 - guess + x / guess ** 2) / 3

    if x ==0.0:
        return 0.0
    else:
        guess = x
    while not_enough():
        guess = go_on()
    return guess
print(rt(8))

在這裡插入圖片描述
上面的內部定義的函式就沒有輸入引數,直接訪問外部函式中的資料,並可以直接對其進行賦值操作等。