這篇文章主要介紹了Python 基礎教程之閉包的使用方法的相關資料,希望大家透過本文能幫助到大家,需要的朋友可以參考下
Python 基礎教程之閉包的使用方法
前言:
閉包(closure)是函數式程式設計的重要的語法結構。函數式程式設計是一種程式設計範式 (而過程導向程式設計和物件導向程式設計也都是程式設計範式)。在過程導向程式設計中,我們見過函數(function);在物件導向程式設計中,我們看過物件(object)。函數和物件的根本目的是以某種邏輯方式組織程式碼,並提高程式碼的可重複使用性(reusability)。閉包也是一種組織程式碼的結構,它同樣提高了程式碼的可重複使用性。
不同的語言實作閉包的方式不同。 Python以函數物件為基礎,為閉包這個語法結構提供支援的 (我們在特殊方法與多範式中,已經多次看到Python使用物件來實作一些特殊的語法)。 Python一切皆對象,函數這個語法結構也是一個對象。在函數對像中,我們像使用普通對像一樣使用函數對象,例如更改函數對象的名字,或將函數對像作為參數進行傳遞。
函數物件的作用域
和其他物件一樣,函數物件也有其存活的範圍,也就是函數物件的作用域。函數物件是使用def語句定義的,函數物件的作用域與def所在的層級相同。例如下面程式碼,我們在line_conf函數的隸屬範圍內定義的函數line,就只能在line_conf的隸屬範圍內呼叫。
def line_conf(): def line(x): return 2*x+1 print(line(5)) # within the scope line_conf() print(line(5)) # out of the scope
line函數定義了一條直線(y = 2x + 1)。可以看到,在line_conf()中可以呼叫line函數,而在作用域之外呼叫line將會有下面的錯誤:
##
NameError: name 'line' is not defined
閉包
def line_conf(): def line(x): return 2*x+1 return line # return a function object my_line = line_conf() print(my_line(5))
def line_conf(): b = 15 def line(x): return 2*x+b return line # return a function object b = 5 my_line = line_conf() print(my_line(5))
函數物件定義時可供參考的b值,而不是使用時的b值。
一個函數和它的環境變數合在一起,就構成了一個閉包(closure)。 在Python中,所謂的閉包是一個包含有環境變數取值的函數物件。環境變數取值被保存在函數物件的__closure__屬性中。例如下面的程式碼:
def line_conf(): b = 15 def line(x): return 2*x+b return line # return a function object b = 5 my_line = line_conf() print(my_line.__closure__) print(my_line.__closure__[0].cell_contents)
def line_conf(a, b): def line(x): return ax + b return line line1 = line_conf(1, 1) line2 = line_conf(4, 5) print(line1(5), line2(5))
閉包與平行運算
並行運算正稱為一個熱點。這也是函數式程式設計又熱起來的重要原因。函數式程式設計早在1950年代就已經存在,但應用並不廣泛。然而,我們上面描述的流水線式的工作並行集群過程,正適合函數式程式設計。由於函數式程式設計這一天然優勢,越來越多的語言也開始加入對函數式程式設計範式的支援。
以上是Python中關於閉包的使用實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!