本文實例講述了Python中dictionary items()系列函數的用法,對Python程序設計有很好的參考借鑒價值。具體分析如下:
先來看一個示例:
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,就像下面這樣:
>>> 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()這一組函數就廢除了?!?/p>
不過更加有意思的是,這個答案雖然被采納,下面的評論卻指出,這種說法并不準確,在 3.x 里 items() 的行為和 2.x 的 iteritems() 不一樣,它實際上返回的是一個"full sequence-protocol object",這個對象能夠反映出 dict 的變化,后來在 Python 2.7 里面也加入了另外一個函數 viewitems() 和 3.x 的這種行為保持一致
為了證實評論中的說法,我做了下面的測試,注意觀察測試中使用的Python版本:
測試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')])
新聞熱點
疑難解答