本文實例講述了Python中dictionary items()系列函數的用法,對Python程序設計有很好的參考借鑑價值。具體分析以下:html
先來看一個示例:linux
import html # available only in Python 3.x def make_elements(name, value, **attrs): keyvals = [' %s="%s"' % item for item in attrs.items()] attr_str = ''.join(keyvals) element = '<{name}{attrs}>{value}</{name}>'.format( name = name, attrs = attr_str, value = html.escape(value)) return element make_elements('item', 'Albatross', size='large', quantity=6) make_elements('p', '<spam>')
該程序的做用很簡單,就是生成HTML標籤,注意html這個模塊只能在Python 3.x纔有。函數
起初我只是注意到,生成標籤屬性列表的keyvals這個dictionary類型變量構建的方式頗有意思,兩個%s對應一個item,因此就查閱了相關的資料,結果扯出了挺多的東西,在此一併總結。測試
注:下面全部Python解釋器使用的版本,2.x 對應的是2.7.3,3.x 對應的是3.4.1
在 Python 2.x 裏,官方文檔裏items的方法是這麼說明:生成一個 (key, value) 對的list,就像下面這樣:spa
>>> d = {'size': 'large', 'quantity': 6} >>> d.items() [('quantity', 6), ('size', 'large')]
在搜索的過程當中,無心看到stackoverflow上這樣一個問題:dict.items()和dict.iteritems()有什麼區別? ,第一個答案大體的意思是這樣的:設計
「起初 items() 就是返回一個像上面那樣的包含dict全部元素的list,可是因爲這樣太浪費內存,因此後來就加入了(注:在Python 2.2開始出現的)iteritems(), iterkeys(), itervalues()這一組函數,用於返回一個 iterator 來節省內存,可是在 3.x 裏items() 自己就返回這樣的 iterator,因此在 3.x 裏items() 的行爲和 2.x 的 iteritems() 行爲一致,iteritems()這一組函數就廢除了。」orm
不過更加有意思的是,這個答案雖然被採納,下面的評論卻指出,這種說法並不許確,在 3.x 裏 items() 的行爲和 2.x 的 iteritems() 不同,它實際上返回的是一個"full sequence-protocol object",這個對象可以反映出 dict 的變化,後來在 Python 2.7 裏面也加入了另一個函數 viewitems() 和 3.x 的這種行爲保持一致
爲了證明評論中的說法,我作了下面的測試,注意觀察測試中使用的Python版本:htm
測試1(Python 2.7.3):對象
Python 2.7.3 (default, Feb 27 2014, 19:58:35) [GCC 4.6.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> d = {'size': 'large', 'quantity': 6} >>> il = d.items() >>> it = d.iteritems() >>> vi = d.viewitems() >>> il [('quantity', 6), ('size', 'large')] >>> it <dictionary-itemiterator object at 0x7fe555159f18> >>> vi dict_items([('quantity', 6), ('size', 'large')])
測試2(Python 3.4.1):內存
Python 3.4.1 (default, Aug 12 2014, 16:43:01) [GCC 4.9.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> d = {'size': 'large', 'quantity': 6} >>> il = d.items() >>> it = d.iteritems() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'dict' object has no attribute 'iteritems' >>> vi = d.viewitems() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'dict' object has no attribute 'viewitems' >>> il dict_items([('size', 'large'), ('quantity', 6)])
能夠看到在 Python 3.x 裏面,iteritems() 和 viewitems() 這兩個方法都已經廢除了,而 item() 獲得的結果是和 2.x 裏面 viewitems() 一致的。
2.x 裏 iteritems() 和 viewitems() 返回的內容都是能夠用 for 來遍歷的,像下面這樣
>>> for k, v in it: ... print k, v ... quantity 6 size large >>> for k, v in vi: ... print k, v ... quantity 6 size large
這二者的區別體如今哪裏呢?viewitems() 返回的是view object,它能夠反映出 dictionary 的變化,好比上面的例子,假如在使用 it 和 vi 這兩個變量以前,向 d 裏面添加一個key-value組合,區別就很容易看出來了。
>>> it = d.iteritems() >>> vi = d.viewitems() >>> d['newkey'] = 'newvalue' >>> d {'newkey': 'newvalue', 'quantity': 6, 'size': 'large'} >>> vi dict_items([('newkey', 'newvalue'), ('quantity', 6), ('size', 'large')]) >>> it <dictionary-itemiterator object at 0x7f50ab898f70> >>> for k, v in vi: ... print k, v ... newkey newvalue quantity 6 size large >>> for k, v in it: ... print k, v ... Traceback (most recent call last): File "<stdin>", line 1, in <module> RuntimeError: dictionary changed size during iteration
在第三行中,咱們像 d 裏面插入了一個新的元素,vi 能夠繼續遍歷,並且新的遍歷可以反映出 d 的變化,可是在遍歷 it 的時候,報錯提示 dictionary 在遍歷的時候大小發生了變化,遍歷失敗。
總結起來,在 2.x 裏面,最初是 items() 這個方法,可是因爲太浪費內存,因此加入了 iteritems() 方法,用於返回一個 iterator,在 3.x 裏面將 items() 的行爲修改爲返回一個 view object,讓它返回的對象一樣也能夠反映出原 dictionary 的變化,同時在 2.7 裏面又加入了 viewitems() 向下兼容這個特性。
因此在 3.x 裏面不須要再去糾結於三者的不一樣之處,由於只保留了一個 items() 方法。
相信本文所述示例對你們的Python程序設計有必定的借鑑價值。