-
Notifications
You must be signed in to change notification settings - Fork 92
好的,以下是 第6章:閉包與柯里化 的內容草稿:
閉包(Closure)和柯里化(Currying)是函數式編程中的兩個重要概念。閉包允許函數記住並訪問其定義時的環境,而柯里化則使得我們可以將多參數函數轉換為一系列單參數函數,從而帶來更高的靈活性與可組合性。
閉包是一個函數,它「封閉」了它的環境,也就是說,閉包可以記住並訪問它定義時的自由變量(free variables),即使這些變量已經超出了它的作用域。
def outer_function(x):
def inner_function(y):
return x + y
return inner_function在這個範例中,inner_function 是一個閉包,它「記住」了外部函數 outer_function 的變量 x,即使在 outer_function 已經執行完畢後,我們仍然可以通過 inner_function 訪問 x。
closure = outer_function(10)
print(closure(5)) # 結果為 15即使 outer_function 已經結束執行,內部的 inner_function 依然可以訪問 x = 10。
閉包常被用於創建工廠函數(Factory Function),即根據不同的輸入生成不同的函數。
def multiplier(factor):
def multiply_by_factor(number):
return number * factor
return multiply_by_factor
doubler = multiplier(2) # 生成倍數為2的函數
tripler = multiplier(3) # 生成倍數為3的函數
print(doubler(5)) # 結果為 10
print(tripler(5)) # 結果為 15在這個範例中,doubler 和 tripler 都是閉包,它們各自「記住」了不同的 factor 值。
在閉包中,我們可以使用 nonlocal 關鍵字來修改閉包環境中的變量。當我們希望在內層函數中修改外層函數的變量時,可以使用 nonlocal。
def outer():
x = 10
def inner():
nonlocal x
x += 5
return x
return inner
closure = outer()
print(closure()) # 結果為 15在這個例子中,nonlocal 關鍵字允許我們在 inner 函數中修改 outer 函數中的 x 變量。
柯里化是指將一個接受多個參數的函數轉換為一系列每次只接受一個參數的函數。柯里化的結果是,每次調用函數時都會返回一個新的函數,直到所有參數都被提供。
def add(x):
def add_y(y):
return x + y
return add_y
add_5 = add(5)
print(add_5(10)) # 結果為 15這是一個手動柯里化的範例,add 函數在接收到 x 之後,返回一個接受 y 的函數。這種函數的拆解使得它更靈活,也更易於組合。
雖然柯里化是逐步應用參數的過程,但在 Python 中,我們可以使用標準庫中的 functools.partial 來實現類似的效果。partial 函數允許我們固定某些參數並返回一個新的函數。
from functools import partial
def power(base, exponent):
return base ** exponent
# 創建一個固定了 base = 2 的新函數
square = partial(power, exponent=2)
print(square(4)) # 結果為 16partial 函數的作用類似於柯里化,它將原始函數的一部分參數固定下來,返回一個新的函數,使其更易於使用。
柯里化在函數式編程中有多種應用場景:
- 增加靈活性:柯里化允許我們靈活地將一個多參數函數分解為多個單參數函數,使得我們可以在不同的上下文中應用部分參數。
- 延遲計算:柯里化允許我們在將所有參數準備好之前構建函數,實現延遲計算。
- 函數組合:柯里化使得函數的組合更加容易,尤其是在構建高階函數時,可以將小型功能逐步組合起來。
def multiply(x, y):
return x * y
def curried_multiply(x):
return lambda y: multiply(x, y)
double = curried_multiply(2) # 創建一個固定乘數為2的函數
print(double(10)) # 結果為 20這個範例展示了如何將柯里化與高階函數結合使用,創建一個新的部分應用函數。
閉包與柯里化是函數式編程中的兩個強大工具。閉包允許函數「記住」它們定義時的環境,這對於創建靈活的、模組化的代碼非常有用。柯里化則提供了一種將多參數函數轉換為一系列單參數函數的方法,從而提升代碼的靈活性與可組合性。這兩個概念相輔相成,為我們構建更加靈活和抽象的代碼打下了基礎。
這是第6章的基本內容草稿,若有需要進一步修改或擴充的部分,請隨時告訴我!
從希爾伯特到圖靈的那些故事
-- 以 Python 展現這些故事背後的程式