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程序设计有一定的借鉴价值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265414.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SVN安装部署

svn安装版本用的是1.8 SVN属于功能性软件,yum安装即是最佳实践。 安装svn yum install subversion 检查svn是否安装完毕 [rootmysql ~]# rpm -qa subversion subversion-1.6.11-15.el6_7.x86_64 卸载原来svn yum remove subverson 设置svn1.8安装源 vim /etc/yum.re…

你可能不知道的跨域解决方案

出于浏览器的同源策略,我们经常会遇到浏览器跨域的问题。 简单的说跨域基本解决方案是: GET请求用JSONP其他请求用同源iframe做代理JSONP的介绍很多,这里就不多说了。 而同源iframe做代理主要是主窗口与iframe的通讯问题,因为这里…

基于wemos D1的无线遥控灯(433m无线模块)

参考:基于wemos D1的无线遥控灯(433m无线模块) 作者:一只小阿大:) 发布时间: 2021-04-16 09:25:53 网址:https://blog.csdn.net/qq_44610809/article/details/115747714 项目软硬件平台及开发环境 1.硬件平台 开发板&#xff1a…

Linux实战教学笔记37:企业级Nginx Web服务优化实战(上)

一,Nginx基本安全优化 1.1 调整参数隐藏Nginx软件版本号信息 一般来说,软件的漏洞都和版本有关,这个很像汽车的缺陷,同一批次的要有问题就都有问题,别的批次可能就都是好的。因此,我们应尽量隐藏或消除Web服…

php debug用什么意思,phpdebug_backtrace()函数是干什么的?

定义和用法PHP debug_backtrace() 函数生成一个 backtrace(回溯信息)。该函数返回一个关联数组。下面是可能返回的元素:名称类型描述function字符串当前的函数名。line整数当前的行号。file字符串当前的文件名。class字符串当前的类名object对象当前对象。type字符串…

探索云计算、大数据的特色化应用之路

云计算与大数据是当前最热门的两个话题,除了技术上的相关性以外,两者现在都面临同一个问题,就是如何更快更好地落地,也就是将云计算、大数据所代表的新技术、新业务模式与行业用户的实际需求紧密结合起来,驱动企业业务…

树莓派摄像头使用Motion监测人物动作

更多干货推荐可以去牛客网看看,他们现在的IT题库内容很丰富,属于国内做的很好的了,而且是课程刷题面经求职讨论区分享,一站式求职学习网站,最最最重要的里面的资源全部免费!!!点击进…

ARM(IMX6U)ARM Cortex-A7中断系统(GPIO按键中断驱动蜂鸣器)

参考:Linux之ARM Cortex-A7 中断系统详解 作者:一只青木呀 发布时间: 2020-09-16 16:07:22 网址:https://blog.csdn.net/weixin_45309916/article/details/108290225 目录1、中断是什么2、回顾STM32中断系统2.1、中断向量表(对应的…

linux php cli 太多,【linux】php cli 处理能力到底有多强?

场景描述:client(单片机) — send MQ —> MQ Server — Received —> php脚本(业务 DB)文字说明: 就是简单的一种MQ应用场景问题描述:(一说到这就想骂人)暂且80个client(听说后期5000的量), 4个PHP脚本处理进程才应付得过来。正常情况下&#xff…

测试——设计思维之获取反馈

获取用户反馈 为什么要测试? 尽早的从用户,干系人,专家那边获得反馈,能够迭代改善通过测试能够知道我们的主意设想的强项和弱势早失败如何测试? 让原型自己说话不要为自己的想法狡辩,原型是给用户&#xff…

Idea 设置Eclipse快捷键(常用)

使用Idea不习惯,特此将其配置成Eclipse风格的。 1、选择Eclipse风格,选择copy一份,可以自己重命名。 2、设置生成快捷键的快捷键(例如:Eclipse中的Alt/) 3、设置main函数快捷键(补充&#xff1a…

php oracle视图,Oracle v$database视图分析

GUARD_STATUS:防止数据库修改的状态(可能为all或者none或者standby) SUPPLEMENTAL_LOG_DATA_MIN: SUPPLEMENTAL_LOG_DATA_PK:SQL> desc v$database名称 是否为空? 类型----------------- -------- ------------DBID NUMBERNAME VARCHAR2(…

精确JS乘除法

//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。function accMul(arg1,arg2) {var m0,s1arg1.toString(),s2arg2.toString();try{ms1.split(".")[1].length}catch(e){}try{ms2.spli…

ARM(I.MX6ULL) EPIT定时器中断实验、定时器按键消抖

参考:Linux之ARM (I.MX6ULL) EPIT定时器详解 作者:一只青木呀 发布时间: 2020-09-20 10:03:37 网址:https://blog.csdn.net/weixin_45309916/article/details/108689629 参考:Linux驱动中按键消…

ThinkPHP模型连接数据库 查询 ajax

1.连接数据库 在模板配置文件里面写 2.创建Model模型 让Home和Admin共同使用 3.实例化模型的方法 第一种: 第二种: M()方法 第三种:D()方法 M()方法和D()方法的区别: 在tp3.2以后,M()和D()是一样的,在3.2…

【转载】实现软件架构质量属性的战术

原文地址:http://www.uml.org.cn/zjjs/201309043.asp 架构设计则为满足架构需求的质量属性寻找适当的战术。对如何实现特定的质量属性感兴趣。质量需求指定了软件的响应,以实现业务目标。我们感兴趣的是设计使用设计模式、架构模式或架构策略创建设计的“…

oracle交叉连接加条件,oracle 的外联接、交叉连接

看到一些网友整理的表连接语句,,十分不清楚,,我来整理一下:oracle的联接分如下几种:内连接(inner join)。外联接:全连接(full join)、左连接(left join)、右连接(right join)。交叉联接(cross j…

新流程的搭建

新建一个流程,怎么建?如果这个问题你心中不能有个逻辑框架,那还是要看完的。 我们做流程管理的,自己做的事情怎么可能没有逻辑呢?这是不可能的。我这里要整理的就是要把我们搭建新流程要做的事情一件一件整理出来&…

NXP (I.MX6ULL) GPT高精度延时定时器

参考:Linux NXP (I.MX6ULL) GPT高精度延时定时器 作者:一只青木呀 发布时间: 2020-09-20 11:50:14 网址:https://blog.csdn.net/weixin_45309916/article/details/108690475 目录GPT 定时器简介GPT 定时器特性GPT 定时器时钟源选择…

oracle容错,Oracle DML容错处理方法

关于DML Error Logging效率的问题,摘自网上一篇文章,作为单独一篇说明,原文如下:DML Error Logging in Oracle 10g Database Release 2In some situations the most obvious solution to a problem is a DML statement (INSERT ..…