我一直認為Python是一門很神奇的語言。神奇之處在於其既可陽春白雪,亦可下裡巴人。也就是其簡單到幾乎所有的人稍加學習即可上手,但是你如果細細品味,就會發現他還有很多高深的東西。正如一位漂亮的姑娘,一眼看上去就會喜歡上。交往深入,你會發現她精通琴棋書畫而且非常有內涵,我相信你這時肯定會深深的迷戀上她。
這篇文字的目的就是想整理一些Python的進階特性,試圖為大家揭開Python的神秘面紗。Python的進階特性如果深入寫的話可以寫成一本書,所以這篇文章也只是淺嘗輒止。如果大家感興趣的話,可以閱讀後面的參考資料。
函數式編程:
所謂函數式編程最直接的解釋就是利用函數式思維來進行思考問題。那麼什麼是函數式思維呢?在Python中,有以下幾種函數式編程相關的話題:
1. 定義匿名函數。
使用lambda可以定義簡單的單行匿名函數。如:
lambda_add = lambda x, y: x + y
這與使用def定義的求和函數完全一樣,可以使用lambda_add作為函數名進行調用。然而,提供lambda的目的是為了編寫偶爾為之的、簡單的、可預見不會被修改的匿名函數。
2. 將函數作為參數。
在Python中可將函數作為參數傳遞。其原因就在於函數也是對象。實際上,在 Python 中函數是一級對象。你可以像其他對象一樣使用而沒有什麼特別的限制。關於函數就是對象的一個最常見的例子就是 C 中的函數指標;將函數傳遞到其他的將要使用它的函數。
>>> #A very simple function>>> def greeter():… print("Hello")…>>> #An implementation of a repeat function>>> def repeat(fn, times):… for i in range(times):… fn()…>>> repeat(greeter, 3)HelloHelloHello>>>
3. 閉包
定義:如果在一個內建函式裡,對在外部範圍(但不是在全域範圍)的變數進行引用,那麼內建函式就被認為是閉包(closure)。其實最準確的說法應該是閉包是由函數和與其相關的引用環境組合而成的實體。來看下面的例子。
>>> a = 0>>> def get_a():… return a…>>> get_a()0>>> a = 3>>> get_a()3
例子中,a為一個global變數,a和get_a()組成了一個閉包,所以a改變時也會直接反應到get_a()函數中。
作用:閉包的作用不言而喻,加強模組化,增強抽象等等。而且在閉包的基礎上才實現了裝飾器。
4. 裝飾器
裝飾器是一個很著名的設計模式,經常被用於有切面需求的情境,較為經典的有插入日誌、效能測試、交易處理等。裝飾器是解決這類問題的絕佳設計,有了裝飾器,我們就可以抽離出大量函數中與函數功能本身無關的雷同代碼並繼續重用。概括的講,裝飾器的作用就是為已經存在的對象添加額外的功能。
比如你想在在調用某個函數時都想計算其執行時間,那麼就可以使用裝飾器來進行,比如下面的代碼
import time def timeit(func): def wrapper(): start = time.clock() func() end =time.clock() print 'used:', end - start return wrapper @timeitdef foo(): print 'in foo()' foo()
5. 內建函數:
諸如map, reduce, filter, zip 之類的,但是我覺得這些都可以利用列表解析來完成,而且還更加優雅。
Further Reading and Reference
函數式編程
1. http://docs.python.org/howto/functional.htmlPython官方文檔,講解了函數式編程的一些要點、原理、機制
2. http://www.cnblogs.com/huxi/archive/2011/06/24/2089358.html作者嘗試引導大家如何用Python使用函數式的思維進行思考
閉包
1. http://linluxiang.iteye.com/blog/789946 Python閉包研究,作者從彙編代碼的角度為大家講解有關閉包的特性及原理
2. http://www.ibm.com/developerworks/cn/linux/l-cn-closure/分析了動態語言(Python、Ruby 和 Lua)中的閉包的概念、形式與應用
裝飾器
1. http://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html這裡講解了有關裝飾器和面向方面(aspect-oriented)編程的一些要點。
其他
1. http://hyperpolyglot.org/scripting作者使用眾多角度(可謂非常多)對解釋性語言(PHP, Perl, Python, Ruby)進行了全面的比較,非常贊!
2. http://pycoders-weekly-chinese.readthedocs.org/en/latest/issue6/a-guide-to-pythons-magic-methods.html有沒有聽說過Python魔術方法?這篇文章肯定會讓你大開眼界,深入瞭解Python更神奇的東西
書籍:
《Python源碼剖析》這本書在C代碼一級,深入細緻地剖析了Python的實現。書中不僅包括了對大量Python內建對象的剖析,更將大量的篇幅用於對Python虛擬機器及Python進階特性的剖析。讀完這本書,相信你能夠理解Python中的一般運算式、控制結構、異常機制、類機制、多線程機制、模組的動態載入機制、記憶體管理機制等核心技術的運行原理,