Python 函式巢狀
阿新 • • 發佈:2021-02-02
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))
上面的內部定義的函式就沒有輸入引數,直接訪問外部函式中的資料,並可以直接對其進行賦值操作等。