python中item函数的⽤法_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 = '<{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', '')
该程序的作⽤很简单,就是⽣成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
value函数什么意思
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程序设计有⼀定的借鉴价值。
【相关推荐】
以上就是Python中items()系列函数的⽤法详解的详细内容,更多请关注php中⽂⽹其它相关⽂章!
本⽂原创发布php中⽂⽹,转载请注明出处,感谢您的尊重!