閉包和偏函式是 Python 函式式程式設計中兩個相當實用的技巧。閉包的概念在於,它能讓內部函式保有外部函式作用域中的變數,即使外部函式已經執行完畢。這就像是一個時光膠囊,把當時的變數狀態儲存下來,供內部函式使用。想像一下在一個大型系統中,你需要一個計數器來追蹤特定事件的發生次數,閉包就能派上用場,避免使用全域變數可能造成的程式碼混亂。另一方面,偏函式則是用來簡化函式呼叫的利器。當你有一個函式需要重複使用,但每次呼叫時,某些引數的值都固定不變,這時就可以使用偏函式。它可以根據現有的函式,建立一個新函式,並預先設定好這些固定的引數,減少程式碼的冗餘。例如在影像處理中,如果需要對多張圖片套用相同的濾鏡,但引數不同,就可以使用偏函式預設部分引數,讓程式碼更簡潔易讀。

閉包與偏函式:Python 函式式程式設計的進階技巧

在 Python 的世界中,函式不僅僅是執行特定任務的程式碼塊,它們還能以多種方式被操作和使用。其中,閉包(Closure)和偏函式(Partial Function)是函式式程式設計中兩個非常強大的概念,它們能讓你的程式碼更具彈性、可讀性更高。身為玄貓,我將分享我如何在實際專案中運用這些技巧,以及它們如何提升程式碼的效率和可維護性。

閉包:讓函式記住「時光膠囊」

閉包是一種特殊的函式,它可以記住其定義時所在的作用域中的變數,即使該作用域已經結束。這種「記憶」能力讓閉包在許多場景下非常有用,例如建立具有內部狀態的函式。

閉包的運作方式

簡單來說,當你在一個函式內部定義另一個函式,並且內部函式使用了外部函式的變數時,就形成了一個閉包。當外部函式傳回內部函式時,這個內部函式就「封裝」了外部函式的變數,即使外部函式已經執行完畢,這些變數仍然可以被內部函式存取和修改。

範例:計數器工廠

以下是一個簡單的計數器範例,展示了閉包的用法:

def counter():
    count = 0  # 外部函式的變數

    def increment():
        nonlocal count  # 允許內部函式修改外部函式的變數
        count += 1
        return count

    return increment

my_counter = counter()
print(my_counter())  # 輸出: 1
print(my_counter())  # 輸出: 2
print(my_counter())  # 輸出: 3

內容解密:

  1. counter() 函式: 這個函式定義了一個變數 count 並初始化為 0。
  2. increment() 函式: 這是定義在 counter() 內部的函式,它使用了 nonlocal 關鍵字來允許修改外部函式 counter()count 變數。
  3. return increment counter() 函式傳回了 increment 函式。
  4. my_counter = counter() 這裡呼叫了 counter(),並將傳回的 increment 函式指定給 my_counter。這時,my_counter 就成了一個閉包,它「記住」了 count 變數。
  5. my_counter() 的呼叫: 每次呼叫 my_counter(),實際上是在呼叫 increment() 函式,並且 increment() 函式會更新並傳回 count 變數的值。

玄貓的經驗分享:閉包的實際應用

在為某金融科技公司設計分散式系統時,我使用閉包來建立具有狀態的請求處理器。每個處理器都需要追蹤已處理的請求數量,以便在達到特定閾值時觸發警示。閉包完美地封裝了這個狀態,避免了使用全域變數可能導致的混亂。

偏函式:預先設定引數的魔法

偏函式允許你根據現有的函式建立一個新函式,並預先設定部分引數。這在需要多次呼叫同一個函式,但某些引數保持不變時非常有用。

使用 functools.partial

Python 的 functools 模組提供了 partial 函式,可以輕鬆建立偏函式。

from functools import partial

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

square = partial(power, exponent=2)
cube = partial(power, exponent=3)

print(square(5))  # 輸出: 25
print(cube(5))  # 輸出: 125

內容解密:

  1. power(base, exponent) 函式: 這個函式接受兩個引數 baseexponent,並傳回 baseexponent 次方。
  2. square = partial(power, exponent=2) 這裡使用 partial 函式建立了一個新的函式 square,它根據 power 函式,但預先設定了 exponent 引數為 2。
  3. cube = partial(power, exponent=3) 同樣地,建立了 cube 函式,預先設定 exponent 引數為 3。
  4. square(5)cube(5) 的呼叫: 當呼叫 square(5) 時,實際上是在呼叫 power(5, 2),而 cube(5) 則是在呼叫 power(5, 3)

玄貓的經驗分享:偏函式的妙用

在開發一個影像處理應用程式時,我需要多次使用不同的引數來呼叫同一個濾鏡函式。使用偏函式,我可以為每個濾鏡建立一個預先設定好引數的新函式,避免了每次呼叫時都重複傳遞相同的引數。

類別與物件:Python 物件導向的根本

Python 是一種廣泛使用的物件導向程式語言。它是一種高階語言,簡單易讀寫,非常適合初學者。Python 以其對物件導向程式設計的強大支援而聞名,物件導向程式設計是一種專注於建立物件(類別的例項)以表示真實世界實體的程式設計範例。

類別和物件是 Python 中物件導向程式設計的基礎。它們允許開發人員建立可重複使用與可維護的程式碼,易於閱讀和理解。類別是建立物件的藍圖,而物件是類別的例項。Python 提供了簡單的語法來建立和使用類別和物件,這使得開發人員可以輕鬆編寫物件導向的程式碼。

類別基礎

在 Python 中,類別是建立具有一組屬性和方法的物件的藍圖。它是一種組織和結構化程式碼的方式,它允許您建立可以在整個程式碼中使用的自訂資料型別。在本筆記中,我們將介紹在 Python 中建立和使用類別的基礎知識。

建立類別

要在 Python 中建立類別,您可以使用 class 關鍵字,後跟類別的名稱。 這是一個例子:

class Person:
    pass

內容解密:

  1. class Person: 陳述式:這行程式碼定義了一個名為 Person 的新類別。pass 陳述式表示這個類別目前是空的,沒有任何屬性或方法。

使用類別

要使用類別,您需要建立該類別的物件。要建立物件,您可以使用類別名稱後跟括號。這是一個例子:

person = Person()

內容解密:

  1. person = Person() 陳述式:這行程式碼建立了 Person 類別的一個新物件,並將其分配給變數 person。現在,person 是一個 Person 類別的例項。

類別屬性

類別可以定義屬性,這些屬性是與類別相關聯的變數。要定義屬性,您可以使用指定陳述式。這是一個例子:

class Person:
    name = "玄貓"
    age = 30

內容解密:

  1. name = "玄貓" 陳述式:這行程式碼定義了一個名為 name 的屬性,並將其設定為 "玄貓"
  2. age = 30 陳述式:這行程式碼定義了一個名為 age 的屬性,並將其設定為 30

類別方法

類別也可以定義方法,這些方法是可以對類別的物件執行的函式。要定義方法,您可以使用 def 關鍵字。這是一個例子:

class Person:
    def say_hello(self):
        print("哈囉,我是" + self.name)

內容解密:

  1. def say_hello(self): 陳述式:這行程式碼定義了一個名為 say_hello 的方法。self 引數是對類別物件本身的參照。
  2. print("哈囉,我是" + self.name) 陳述式:這行程式碼列印一條問候訊息,其中包含物件的 name 屬性。