天天看點

python for item in items_Python中items()系列函數的用法詳解

這篇文章主要介紹了Python中dictionary items()系列函數的用法,很實用的函數,需要的朋友可以參考下

本文執行個體講述了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 = '{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', '')

該程式的作用很簡單,就是生成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程式設計有一定的借鑒價值。

【相關推薦】

1. 特别推薦:“php程式員工具箱”V0.1版本下載下傳

2. Python免費視訊教程

3. Python基礎入門之items()方法

4. Python中的item()函數周遊字典的執行個體

5. 介紹三種通路字典的方法

6. 在sorted中iteriitems和items不同之處