Skip to content
ccckmit edited this page Dec 4, 2024 · 1 revision

好的,以下是 第6章:閉包與柯里化 的內容草稿:


第6章:閉包與柯里化

閉包(Closure)和柯里化(Currying)是函數式編程中的兩個重要概念。閉包允許函數記住並訪問其定義時的環境,而柯里化則使得我們可以將多參數函數轉換為一系列單參數函數,從而帶來更高的靈活性與可組合性。

6.1 什麼是閉包?

閉包是一個函數,它「封閉」了它的環境,也就是說,閉包可以記住並訪問它定義時的自由變量(free variables),即使這些變量已經超出了它的作用域。

6.1.1 閉包的範例
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

6.1.2 閉包的應用場景

閉包常被用於創建工廠函數(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

在這個範例中,doublertripler 都是閉包,它們各自「記住」了不同的 factor 值。

6.2 Python 中的 nonlocal 關鍵字

在閉包中,我們可以使用 nonlocal 關鍵字來修改閉包環境中的變量。當我們希望在內層函數中修改外層函數的變量時,可以使用 nonlocal

6.2.1 nonlocal 的範例
def outer():
    x = 10
    def inner():
        nonlocal x
        x += 5
        return x
    return inner

closure = outer()
print(closure())  # 結果為 15

在這個例子中,nonlocal 關鍵字允許我們在 inner 函數中修改 outer 函數中的 x 變量。

6.3 柯里化

柯里化是指將一個接受多個參數的函數轉換為一系列每次只接受一個參數的函數。柯里化的結果是,每次調用函數時都會返回一個新的函數,直到所有參數都被提供。

6.3.1 柯里化的範例
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 的函數。這種函數的拆解使得它更靈活,也更易於組合。

6.4 functools 中的 partial 函數

雖然柯里化是逐步應用參數的過程,但在 Python 中,我們可以使用標準庫中的 functools.partial 來實現類似的效果。partial 函數允許我們固定某些參數並返回一個新的函數。

6.4.1 partial 的範例
from functools import partial

def power(base, exponent):
    return base ** exponent

# 創建一個固定了 base = 2 的新函數
square = partial(power, exponent=2)

print(square(4))  # 結果為 16

partial 函數的作用類似於柯里化,它將原始函數的一部分參數固定下來,返回一個新的函數,使其更易於使用。

6.5 柯里化的實用性

柯里化在函數式編程中有多種應用場景:

  1. 增加靈活性:柯里化允許我們靈活地將一個多參數函數分解為多個單參數函數,使得我們可以在不同的上下文中應用部分參數。
  2. 延遲計算:柯里化允許我們在將所有參數準備好之前構建函數,實現延遲計算。
  3. 函數組合:柯里化使得函數的組合更加容易,尤其是在構建高階函數時,可以將小型功能逐步組合起來。
6.5.1 範例:柯里化與高階函數的結合
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.6 小結

閉包與柯里化是函數式編程中的兩個強大工具。閉包允許函數「記住」它們定義時的環境,這對於創建靈活的、模組化的代碼非常有用。柯里化則提供了一種將多參數函數轉換為一系列單參數函數的方法,從而提升代碼的靈活性與可組合性。這兩個概念相輔相成,為我們構建更加靈活和抽象的代碼打下了基礎。


這是第6章的基本內容草稿,若有需要進一步修改或擴充的部分,請隨時告訴我!

Clone this wiki locally