今天是Python专题的第7篇文章,我们继续介绍迭代相关。

enumerate

首先介绍的是enumerate函数。

在我们日常编程的过程当中,经常会遇到一个问题。

在C语言以及一些古老的语言当中是没有迭代器这个概念的,所以我们要遍历数组或者是容器的时候,往往只能通过下标。有了迭代器之后,我们遍历的过程方便了很多,我们可以直接用一个变量去迭代一个容器当中的值。最简单的例子就是数组的遍历,比如我们要遍历items这个数组。我们可以直接:

通过迭代器的方式我们可以很轻松地遍历数组,而不再需要下标,也不需要计算数组的长度了。但是如果我们在循环体当中需要知道元素的下标该怎么办

难道我们真的只能在下标和迭代器当中选择一个吗,比如在循环体的外面添加一个变量来记录下标?

这样可以解决问题,但是很麻烦,一点也不简洁,用专业的话来说一点也不pythonic(符合Python标准的代码)。为了追求pythonic,于是有了enumerate函数,来解决了我们又想直接迭代又需要知道元素下标的情形。

它的用法也很简单,我们把需要迭代的对象或者迭代器传入enumerate函数当中,它会为我们创建一个新的迭代器,同时返回下标以及迭代的内容。我们来看一个例子:

除此之外,enumerate还支持传入参数。比如在某些场景当中,我们希望下标从1开始,而不再是0开始,我们可以额外多传入一个参数实现这点:

循环是我们编程的时候必不可少的操作,也正因此,enumerate函数使用非常广泛。但是有一点需要注意,如果我们迭代的是一个多元组数组,我们需要注意要将index和value区分开。举个例子:

在不用enumerate的时候,我们有两种迭代方式,这两种都可以运行。

但是如果我们使用enumerate的话,由于引入了一个index,我们必须要做区分,否则会报错,所以我们只有一种迭代方式:

zip

接下来要介绍的另一个函数同样是方便我们迭代的,不过它针对的是另一个场景——多对象迭代

它的应用场景非常简单,就是我们想要同时迭代多份数据,比如用户的名字和用户的职业数据是分开的,我们希望同时遍历一个用户的职业和名字。如果不使用zip,我们可能只能放弃迭代器回到传统的下标遍历的模式了。这样当然是可以的,不过有两个小问题,第一个小问题当然是代码的可读性变差了,不够pythonic,第二个问题是我们需要维护两个容器长度不一样的情况,会增加额外的代码。而使用zip,可以同时解决以上两个问题。

我们来看一个例子:

最后输出的结果是人名和职业的tuple:

上面举的例子当中,names和jobs的长度其实是不一致的,在使用了zip的情况下,会自动替我们按照其中较短的那个进行截断。如果我们不希望截断,我们也可以使用itertools下的zip_longest来代替zip:

这样的话长度不够的元素会以None来填充,zip_longest提供了一个参数fillvalue,可以填充成我们指定的值。

无论是zip还是zip_longest,都可以支持多迭代器的遍历。比如:

zip除了方便我们迭代遍历之外,另一个很大的用处是可以很方便地生成dict。比如刚才的例子当中,我们想生成一个名称和职业的dict,一般的办法当然是先定义一个dict,然后遍历所有的key和value,来生成dict。然而使用zip,我们可以将这个操作简化到一行代码:

需要注意的是,我们调用zip返回的结果其实是一个迭代器,我们在转化成dict的时候自动遍历了迭代器当中的内容。比如我们如果直接打印出zip调用结果的话,就会发现屏幕上输出的是一个迭代器的地址:

我们想要获得它的内容,需要将它手动转成list:

无论是enumerate还是zip其实底层都是基于迭代器实现的,从原理上来说并没有什么太深奥的内容,而且我们不使用它们也不影响我们写代码。但是Python之所以是Python,之所以很多人称道它简洁的语言和逻辑,离不开我们广泛地使用这些简化代码逻辑的工具和方法。因此我们加以了解是非常有必要的,希望大家都能写出pythonic的代码,不仅写代码能力强,而且代码本身也漂亮。

今天的文章就是这些,如果觉得有所收获,请顺手点个关注或者转发吧,你们的举手之劳对我来说很重要。

python dict遍历_Python专题——详解enumerate与zip用法相关推荐

  1. python dict遍历_python入门

    python:简洁,优雅,快捷 简洁到变量可以不用定义直接用,可以调用很多函数,方便移植,对数据的处理速度快,但是耗内存 我学习python的时候,感觉这就像是在看小学生的作业,当然只是刚学习到了基础 ...

  2. python dict遍历_Python教程:Python数据类型之字典(附学习教程)

    字典是另一种可变容器模型,且可存储任意类型对象,是除列表以外python之中最灵活的内置数据结构类型.查找速度非常快,一个元素和10W个元素没有什么区别. 堆栈的词典 字典的无序特性和创建: 列表是有 ...

  3. python dict遍历_Python学习笔记:19个pythonic编程习惯,让你的Python入门更优雅

    Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净.整洁.一目了然. 要写出 Pythonic(优雅的.地道的.整洁的)代码,需要多看多学大牛们写的代码,github 上有很多非常优 ...

  4. python dict遍历_Python 容器(二):字典(Dict)

    Python 容器(二):字典(Dict) 一.字典 1.定义:Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value)的形式,根据key的值计算value的地址,具有 ...

  5. python dict遍历_python 字典(dict)遍历的四种方法性能测试报告

    python中,遍历dict的方法有四种.但这四种遍历的性能如何呢?我做了如下的测试 l = [(x,x) for x in xrange(10000)] d = dict(l) from time ...

  6. [转载] 递归函数python基例_python递归函数详解 python 递归函数使用装饰器

    参考链接: Python递归 移动宽带检查显示 CRM,radius状态不一致是怎么回事啊?您可以把电信宽带猫等设备重启试一下,如果仍然不行,可以拨打10000号请工作人员帮您查看.处理. 电信宽带诊 ...

  7. python fields函数_Python函数详解

    # ------------------------------------一等函数------------------------------------ # 龟叔: 虽然我把函数定为一等对象,但是 ...

  8. python dict遍历_python遍历字典dict的几种方法汇总

    python遍历字典dict的方法: dic={'a':'how','b':'are','c':'you'}; 方法1, for key in dic: print key,dic[key] 方法2, ...

  9. python 字典长度_python字典详解

    字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 ,格式如下所示: di ...

  10. python字典遍历输出_详解Python字典的复制与遍历

    本篇介绍Python中字典的复制与遍历.文中会讨论字典的浅复制与深复制的区别,字典的遍历方法和方式.通过本篇的学习,可以了解字典浅复制与深复制的区别,掌握字典遍历的方法和方式. 1.字典的复制 Pyt ...

最新文章

  1. 【基础】ABAP不同变量类型之间数值大小比较
  2. mac php命令行模式,phpstorm分别在Mac和Windows下启动命令行,并启用ssh
  3. python读取json数据教程_Python教程之解析json数据
  4. java 搜索起始位置,从Java中的给定位置搜索字符
  5. 【干货】300余份数字化资料包免费下载(报告、白皮书、方案、政策等)
  6. NET Core-学习笔记(二)
  7. python辅助 sublime_Sublime+python设置
  8. oracle 获取当前用户下的所有表名与字段信息
  9. Tomcat中文乱码问题【已亲测可用】
  10. Word文档插入没有可用的联机内容
  11. Word公式自动编号
  12. python 等值面_三维等值面提取算法(Dual Contouring)
  13. html视频怎么自动播放一次,HTML5视频自动播放/播放一次
  14. win7下安装MySQL的步骤
  15. 彪悍的人生不需要解释,需要解释的人生是软弱的
  16. Windows设置VMware虚机开机自启
  17. mysql数据库服务器重启_重启mysql数据库服务器
  18. VS用OLE方式对Excel进行读写操作
  19. AWVS14.1安装
  20. # IDEA如何从dao层接口快速调转到xml文件

热门文章

  1. 形象描述oracle是如何工作的--有点意思
  2. maven 配置tomcat 插件
  3. 【算法】排序_计数排序
  4. exists/not exists(2020-3-27)
  5. mysql+修改数据恢复_MySQL 误操作后数据恢复(update,delete忘加where条件)
  6. java中model的意思_开发中model,entity和pojo的区别
  7. 2020年最好用的手机是哪一款_2020年千元机中性能最好的4款手机,印象最让你深刻的是哪一款?...
  8. 烤箱定时器不走怎么办_走夜路害怕怎么办?带上这6大辟邪文玩在也不害怕
  9. ASP.NET 2.0运行原理及其过程简要分析
  10. 大型架构.net平台篇(WEB层均衡负载nginx)