閉包和偏函式是 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
內容解密:
counter()函式: 這個函式定義了一個變數count並初始化為 0。increment()函式: 這是定義在counter()內部的函式,它使用了nonlocal關鍵字來允許修改外部函式counter()的count變數。return increment:counter()函式傳回了increment函式。my_counter = counter(): 這裡呼叫了counter(),並將傳回的increment函式指定給my_counter。這時,my_counter就成了一個閉包,它「記住」了count變數。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
內容解密:
power(base, exponent)函式: 這個函式接受兩個引數base和exponent,並傳回base的exponent次方。square = partial(power, exponent=2): 這裡使用partial函式建立了一個新的函式square,它根據power函式,但預先設定了exponent引數為 2。cube = partial(power, exponent=3): 同樣地,建立了cube函式,預先設定exponent引數為 3。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
內容解密:
class Person:陳述式:這行程式碼定義了一個名為Person的新類別。pass陳述式表示這個類別目前是空的,沒有任何屬性或方法。
使用類別
要使用類別,您需要建立該類別的物件。要建立物件,您可以使用類別名稱後跟括號。這是一個例子:
person = Person()
內容解密:
person = Person()陳述式:這行程式碼建立了Person類別的一個新物件,並將其分配給變數person。現在,person是一個Person類別的例項。
類別屬性
類別可以定義屬性,這些屬性是與類別相關聯的變數。要定義屬性,您可以使用指定陳述式。這是一個例子:
class Person:
name = "玄貓"
age = 30
內容解密:
name = "玄貓"陳述式:這行程式碼定義了一個名為name的屬性,並將其設定為"玄貓"。age = 30陳述式:這行程式碼定義了一個名為age的屬性,並將其設定為30。
類別方法
類別也可以定義方法,這些方法是可以對類別的物件執行的函式。要定義方法,您可以使用 def 關鍵字。這是一個例子:
class Person:
def say_hello(self):
print("哈囉,我是" + self.name)
內容解密:
def say_hello(self):陳述式:這行程式碼定義了一個名為say_hello的方法。self引數是對類別物件本身的參照。print("哈囉,我是" + self.name)陳述式:這行程式碼列印一條問候訊息,其中包含物件的name屬性。