本文实例讲述了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程序设计有一定的借鉴价值。

python items函数用法,Python中dictionary items()系列函数的用法实例相关推荐

  1. Python之pandas:pandas中to_csv()、read_csv()函数的index、index_col(不将索引列写入)参数详解之详细攻略

    Python之pandas:pandas中to_csv().read_csv()函数的index.index_col(不将索引列写入)参数详解之详细攻略 目录 pandas中to_csv().read ...

  2. pandas使用replace函数替换dataframe中的值:replace函数使用正则表达式对dataframe中的值进行替换

    pandas使用replace函数替换dataframe中的值:replace函数使用正则表达式对dataframe中的值进行替换 目录

  3. c语言 格式转换函数,C语言中的格式转换函数.doc

    C语言中的格式转换函数 C语言中的格式转换函数 表头文件 #include 定义函数 double atof(const char *nptr); 函数说明 atof()会扫描参数nptr字符串,跳过 ...

  4. python中字符串函数的用法_python中字符串内置函数的用法介绍(代码)

    本篇文章给大家带来的内容是关于python中字符串内置函数的用法介绍(代码) ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. capitalize() 首字母大写a='somewor ...

  5. python中内置函数的用法_python中str内置函数用法总结

    大家在使用python的过程中,应该在敲代码的时候经常遇到str内置函数,为了防止大家搞混,本文整理归纳了str内置函数.1字符串查找类:find.index:2.字符串判断类:islower.isa ...

  6. python中字符串函数的用法_python中字符串内置函数的用法总结

    capitalize() 首字母大写 a='someword' b=a.capitalize() print(b) ->Someword casefold()&lower() 所有字母变 ...

  7. python str byte编码_Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题...

    Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Python 3不会以任意隐式的方式混用str ...

  8. python中numpy的用法_Python中numpy多维数组的用法

    继上篇讲过numpy如何构建多维数组之后,今天我们来学习numpy多维数组的用法. 加法和减法操作要求操作双方的维数信息一致,均为M*N为数组方可正确执行操作. a = np.arange(4) 输出 ...

  9. python中sort函数源代码_Python中sort和sorted函数代码解析

    Python中sort和sorted函数代码解析 本文研究的主要是Python中sort和sorted函数的相关内容,具体如下. 一.sort函数 sort函数是序列的内部函数 函数原型: L.sor ...

最新文章

  1. python队列学习笔记
  2. 【Python】json
  3. ERP顾问在甲方好还是乙方好?
  4. Windows 10安装pip方法
  5. html 日历系统 源码,calendar.html
  6. layui绑定json_JSON绑定:概述系列
  7. js中var、let、const区别
  8. 信息学奥赛一本通 1978:【18NOIP普及组】标题统计 | 洛谷 P5015 [NOIP2018 普及组] 标题统计
  9. 随想录(谈谈软件架构)
  10. 在SQL Server中加入包含假设和CE模型变化
  11. 程序员之痛:六次创业五回失败了
  12. javascript获取网址参数
  13. 基于Cocos2d-x开发guardCarrot--2 《保卫萝卜2》主页面开发
  14. IDEA设置SQL格式化(关键字大写)
  15. java实现在线预览word(docx)功能
  16. 形容词记忆(二):ful,ous,ant后缀常用词
  17. Qt 配置使用IPP库
  18. 记2021DASCTF没做出来的那些题(已更新官wp版本)
  19. mysql中add_months_oracle中add_months()函数总结
  20. C语言程序怎么读取亮度值,颜色空间RGB与 色调、饱和度、亮度(ESL)转换的完整C语言算法...

热门文章

  1. Hyper-v Server 2012 Release Candidate 部署体验
  2. 如何在PFSense中设置故障转移和负载平衡
  3. hdoj3351-stack
  4. Meteor创建示例项目 Simple-todos
  5. ubuntu网站做图像外链
  6. java ee 中文乱码的问题
  7. My97DatePicker在asp.net项目中的使用
  8. linux下的DNS服务器详解
  9. Halcon:手眼标定——眼在手外与眼在手上
  10. 微软Visual Studio 2012软件功能介绍