亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python中dictionary items()系列函數的用法實例

系統 2000 0

本文實例講述了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}'.format( 
      name = name, 
      attrs = attr_str, 
      value = html.escape(value)) 
  return element 
make_elements('item', 'Albatross', size='large', quantity=6) 
make_elements('p', '
            
              ') 


            
          

該程序的作用很簡單,就是生成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()這一組函數就廢除了。”

不過更加有意思的是,這個答案雖然被采納,下面的評論卻指出,這種說法并不準確,在 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 

            
               
>>> 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 "
            
              ", line 1, in 
              
                 
AttributeError: 'dict' object has no attribute 'iteritems' 
>>> vi = d.viewitems() 
Traceback (most recent call last): 
 File "
                
                  ", line 1, in 
                  
                     
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 

            
               
>>> 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 "
              
                ", line 1, in 
                
                   
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程序設計有一定的借鑒價值。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 中文字幕日本不卡一二三区 | 久久久成人影院 | 97精品高清一区二区三区 | 999热这里只有精品 999人在线精品播放视频 | 久久精品美女 | 国产一级精品高清一级毛片 | 免费人成激情视频在线看 | 男人的天堂欧美精品色偷偷 | 精品视频在线免费 | 黑人超长巨大xxxxxxx视频 | 天天天天色 | 看黄色一级毛片 | 久久久国产精品网站 | 亚洲欧美人成人让影院 | 成年女人看片免费视频频 | 久久久久依人综合影院 | 奇米777第四 | 日本一线一区二区三区免费视频 | 国产精品久久久久久久久鸭 | 看欧美的一级毛片 | 日韩中文字幕在线 | 91拍拍在线观看 | 日韩毛片欧美一级a网站 | 波多野结衣中文字幕一区二区 | 香蕉视频亚洲一级 | 按摩一级片 | 九九香蕉网 | 亚洲国产最新 | 视频在线二区 | 97在线免费视频 | 爱久久www.35669 | 98色花堂国产精品首页 | 国产精品国产三级国产无毒 | 四虎影视在线永久免费观看 | 四虎免费永久在线播放 | 欧美日韩亚洲国产精品 | 91国内精品线免费播放 | 天天插天天操 | 伊人成人在线视频 | 国产精品亚洲综合色拍 | 欧美一级精品高清在线观看 |