Python中dictionary items()系列函數(shù)的用法實(shí)例
本文實(shí)例講述了Python中dictionary items()系列函數(shù)的用法,對(duì)Python程序設(shè)計(jì)有很好的參考借鑒價(jià)值。具體分析如下:
先來看一個(gè)示例:
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標(biāo)簽,注意html這個(gè)模塊只能在Python 3.x才有。
起初我只是注意到,生成標(biāo)簽屬性列表的keyvals這個(gè)dictionary類型變量構(gòu)建的方式很有意思,兩個(gè)%s對(duì)應(yīng)一個(gè)item,所以就查閱了相關(guān)的資料,結(jié)果扯出了挺多的東西,在此一并總結(jié)。
注:下面所有Python解釋器使用的版本,2.x 對(duì)應(yīng)的是2.7.3,3.x 對(duì)應(yīng)的是3.4.1
在 Python 2.x 里,官方文檔里items的方法是這么說明:生成一個(gè) (key, value) 對(duì)的list,就像下面這樣:
>>> d = {'size': 'large', 'quantity': 6} >>> d.items() [('quantity', 6), ('size', 'large')]
在搜索的過程中,無意看到stackoverflow上這樣一個(gè)問題:dict.items()和dict.iteritems()有什么區(qū)別? ,第一個(gè)答案大致的意思是這樣的:
“起初 items() 就是返回一個(gè)像上面那樣的包含dict所有元素的list,但是由于這樣太浪費(fèi)內(nèi)存,所以后來就加入了(注:在Python 2.2開始出現(xiàn)的)iteritems(), iterkeys(), itervalues()這一組函數(shù),用于返回一個(gè) iterator 來節(jié)省內(nèi)存,但是在 3.x 里items() 本身就返回這樣的 iterator,所以在 3.x 里items() 的行為和 2.x 的 iteritems() 行為一致,iteritems()這一組函數(shù)就廢除了?!?/p>
不過更加有意思的是,這個(gè)答案雖然被采納,下面的評(píng)論卻指出,這種說法并不準(zhǔn)確,在 3.x 里 items() 的行為和 2.x 的 iteritems() 不一樣,它實(shí)際上返回的是一個(gè)"full sequence-protocol object",這個(gè)對(duì)象能夠反映出 dict 的變化,后來在 Python 2.7 里面也加入了另外一個(gè)函數(shù) viewitems() 和 3.x 的這種行為保持一致
為了證實(shí)評(píng)論中的說法,我做了下面的測(cè)試,注意觀察測(cè)試中使用的Python版本:
測(cè)試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')])
測(cè)試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() 這兩個(gè)方法都已經(jīng)廢除了,而 item() 得到的結(jié)果是和 2.x 里面 viewitems() 一致的。
2.x 里 iteritems() 和 viewitems() 返回的內(nèi)容都是可以用 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
這兩者的區(qū)別體現(xiàn)在哪里呢?viewitems() 返回的是view object,它可以反映出 dictionary 的變化,比如上面的例子,假如在使用 it 和 vi 這兩個(gè)變量之前,向 d 里面添加一個(gè)key-value組合,區(qū)別就很容易看出來了。
>>> 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 里面插入了一個(gè)新的元素,vi 可以繼續(xù)遍歷,而且新的遍歷能夠反映出 d 的變化,但是在遍歷 it 的時(shí)候,報(bào)錯(cuò)提示 dictionary 在遍歷的時(shí)候大小發(fā)生了變化,遍歷失敗。
總結(jié)起來,在 2.x 里面,最初是 items() 這個(gè)方法,但是由于太浪費(fèi)內(nèi)存,所以加入了 iteritems() 方法,用于返回一個(gè) iterator,在 3.x 里面將 items() 的行為修改成返回一個(gè) view object,讓它返回的對(duì)象同樣也可以反映出原 dictionary 的變化,同時(shí)在 2.7 里面又加入了 viewitems() 向下兼容這個(gè)特性。
所以在 3.x 里面不需要再去糾結(jié)于三者的不同之處,因?yàn)橹槐A袅艘粋€(gè) items() 方法。
相信本文所述示例對(duì)大家的Python程序設(shè)計(jì)有一定的借鑒價(jià)值。
相關(guān)文章
基于python神經(jīng)卷積網(wǎng)絡(luò)的人臉識(shí)別
這篇文章主要為大家詳細(xì)介紹了基于python神經(jīng)卷積網(wǎng)絡(luò)的人臉識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05一步步教你用python給女朋友寫個(gè)微信自動(dòng)提醒的程序
如今微信已成為我們?nèi)粘I畹闹饕涣鞴ぞ?但是微信自身的功能有時(shí)候可能并不能滿足我們的需要,因此我們會(huì)想是否可以進(jìn)行微信功能的拓展呢,這篇文章主要給大家介紹了關(guān)于利用python給女朋友寫了個(gè)微信自動(dòng)提醒程序的相關(guān)資料,需要的朋友可以參考下2021-10-10Python中使用platform模塊獲取系統(tǒng)信息的用法教程
這里我們整理了Python中使用platform模塊獲取系統(tǒng)信息的用法教程,包括操作系統(tǒng)與Python環(huán)境以及系統(tǒng)的環(huán)境變量等信息的獲取方法:2016-07-07pytorch加載的cifar10數(shù)據(jù)集過程詳解
這篇文章主要介紹了pytorch加載的cifar10數(shù)據(jù)集,到底有沒有經(jīng)過歸一化,本文對(duì)這一問題給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-11-11python中三種輸出格式總結(jié)(%,format,f-string)
在Python語言編程中,我們會(huì)與字符串打交道,那務(wù)必會(huì)輸出字符串來查看字符串的內(nèi)容,下面這篇文章主要給大家介紹了關(guān)于python中三種輸出格式的相關(guān)資料,三種格式分別是%,format,f-string,需要的朋友可以參考下2022-03-03