[本文出自天外歸雲的博客園]python
下面代碼圍繞一個Student類綜合舉例說明裝飾器、生成器、動態獲取/添加類成員、列表推導式、reduce函數、lambda表達式的實際應用:git
from functools import reduce def show(func): def wrapper(_object): print([i for i in func(_object)]) return wrapper @show def generator(_object): for attr in _object.__dict__: yield(attr,_object.__dict__[attr]) class Student(object): def __init__(self, **kwargs): for key,value in kwargs.items(): if not hasattr(self,key): setattr(self,key,value) def show_info(func): def wrapper(self): print(func(self)) return wrapper @show_info def info(self): info = [str(k)+":"+str(v) for k, v in self.__dict__.items()] return reduce((lambda x,y:x+" "+y), info) if __name__ == '__main__': s = Student(score=1,name="asdfa",school="anda") generator(s) s.score=11 s.info()
這個Student類的功效是:能夠動態的添加任意數量的成員變量,而且提供信息打印的方法。github
運行結果:數據結構
1. 裝飾器:經過函數嵌套的方式,以被裝飾函數做爲裝飾器函數入參,用函數修飾函數的一種方法。上面代碼中的show和show_info函數都是裝飾器;app
2. 生成器:經過for循環調用yield函數生產出一個可迭代的結果集,能夠將生成器當作一個生產者。上面的代碼中generator就是一個生產者,他的修飾器函數show中對他的生產結果進行了消費。能夠把show函數理解爲消費者;ide
3. 動態獲取/添加類成員:分別是上面代碼中的hasattr函數和setattr函數;函數
4. 列表推導式:一種for循環生成列表的pythonic寫法,如上面代碼中show函數中print的部分和show_info函數中的info的值的部分都用到了列表推導式;學習
5. 函數reduce:這個函數能夠結合lambda表達式來使用,按照lambda表達式中定義的規則對列表中的全部元素進行運算並返回一個值;spa
6. 表達式lambda:一個lambda表達式就表明一個匿名函數,如上面代碼中reduce函數中的部分,定義了一個入參爲x和y,函數體爲x+" "+y的匿名函數,這個函數體的計算結果也是lambda表達式的返回值。code
另外:
1. 須要從數據結構兩端取數據或append的時候能夠用from collections import deque,雙向隊列;
2. 自省對象的方法有inspect和dir。
學習更多python高級用法,推薦閱讀: