Python進階之路:operator模組

Python之父Guido曾經說過,Python不是一門為函數語言程式設計設計的語言。但是得益於Python中強大的工具包,我們可以輕鬆地實現函式式的程式設計風格。今天小編想要給大家介紹的就是其中重要的一個模組:operator。

Python進階之路:operator模組

我們先來看一個例子。如果我們現在想要實現一個階乘的函式,一種比較簡潔的方法是使用reduce函式來實現:

Python進階之路:operator模組

非常的簡潔優雅是不是。但是還不夠完美,因為這裡使用了一個lambda匿名函式,用來實現兩個變數相乘的功能。其實,operator模組中為我們提供了大量可以用來替代代數運算子的函式來,因此我們可以用operatior。mul來重寫上面的函式:

Python進階之路:operator模組

除了代數運算子,operator模組中另兩個非常重要的方法是

itemgetter

attrgetter

。這兩個函式可以從一個序列或者物件中去獲取指定的元素或屬性值。我們再來看一個例子,將一個元組列表按元組中的值排序。為此,我們使用itemgetter(1)來生成一個函式去獲取元組中的第一個值,其效果等同於lambda函式lambda fields: fields[1]。

Python進階之路:operator模組

如果我們向itemgetter傳遞多個索引引數,那麼其返回的函式獲取的將是由對應索引值所組成的元組。

Python進階之路:operator模組

我們再來看attrgetter函式,它的功能是生成一個函式,該函式將根據輸入的字串屬性名返回一個物件的屬性值。如果輸入多個屬性名,則返回由多個屬性值組成的元組。另外,屬性名可以是由“。”分隔的巢狀格式。我們來看下面這個例子:

Python進階之路:operator模組

Python進階之路:operator模組

在這個例子中,我們可以看到attrgetter生成了name_lat函式,並用它獲取Metropolis的屬性值。

除了上面介紹的幾個函式外,我們可以透過dir()來看一下operator模組中包含的其它函式

Python進階之路:operator模組

它們的功能大部分都比較容易理解。需要注意的是,其中以字母i開頭的函式,如iadd,iand,它們的功能相當於+=,&=等自運算子。如果這些函式的第一個引數是可變的,就會將運算結果賦值給第一個引數。如果第一個引數是不可變的,那麼它們的效果和不帶i的版本一樣,將運算結果返回。

作為最後一個例子,我們來介紹一下methodcaller函式。這個函式與itemgetter和attrgetter類似,也會返回一個函式,這個函式的作用是呼叫一個物件的方法。方法名和引數在methodcaller的呼叫引數中指定,而作用的物件則在被生成函式的引數中指定。

Python進階之路:operator模組

在上面的例子中,首先我們透過methodcaller得到一個函式upcase,該函式將呼叫被作用物件的upper方法。然後我們將一個字串傳遞給upcase函式,就相當於呼叫了這個字串的upper方法了。

總結一下,operator模組為我們提供了非常豐富的工具函式,可以幫助我們寫出簡潔易懂的函式是程式設計風格的程式碼。