Python专题之详解enumerate和zip
enumerate
第一个是枚举函数。
在我们的日常编程过程中,我们经常遇到一个问题。
在C语言和一些古老的语言中没有迭代器的概念,所以当我们想要遍历数组或容器时,我们只能使用下标。使用迭代器,我们的遍历过程更加方便。我们可以直接使用变量来迭代容器中的值。最简单的例子是数组遍历。例如,我们需要遍历items数组。我们可以直接:
for item in items:
通过迭代器的方法,可以方便地遍历数组而不需要下标和计算数组的长度。但是如果我们需要知道循环体中元素的下标呢?
我们真的需要在下标和迭代器之间进行选择吗,比如在循环体之外添加一个变量来记录下标?
idx = 0 for item in items:
operation()
idx += 1
这可以解决问题,但很麻烦,一点也不简洁,专业术语也不是pythonic(Python标准代码)。为了追求pythonic,我们使用了枚举函数来解决直接迭代需要知道元素下标的情况。
它的用法也很简单。我们将需要迭代的对象或迭代器传递到枚举函数中。它将为我们创建一个新的迭代器,并返回下标和迭代的内容。举个例子:
for i, item in enumerate(items):
此外,枚举还支持传入参数。例如,在某些情况下,我们希望下标从1开始,而不是从0开始。我们可以传递一个附加参数来实现这一点:
for i, item in enumerate(items, 1):
循环是我们编程中的一个基本操作。因此,枚举函数得到了广泛的应用。但是,应该注意的是,如果我们在一个多组数组上迭代,我们需要区分索引和值。例如:
data = [(1, 3), (2, 1), (3, 3)]
在不用enumerate的时候,我们有两种迭代方式,这两种都可以运行。
for x, y in data: for (x, y) in data:
但是,如果我们使用枚举,因为引入了索引,我们必须进行区分,否则会报告错误,因此我们只有一种迭代方法:
for i, (x, y) in enumerate(data):
zip
接下来要介绍的另一个函数同样是方便我们迭代的,不过它针对的是另一个场景——多对象迭代。
它的应用场景非常简单,就是我们想要同时迭代多份数据,比如用户的名字和用户的职业数据是分开的,我们希望同时遍历一个用户的职业和名字。如果不使用zip,我们可能只能放弃迭代器回到传统的下标遍历的模式了。这样当然是可以的,不过有两个小问题,第一个小问题当然是代码的可读性变差了,不够pythonic,第二个问题是我们需要维护两个容器长度不一样的情况,会增加额外的代码。而使用zip,可以同时解决以上两个问题。
我们来看一个例子:

最后输出的结果是人名和职业的tuple:
xiaoming coach
xiaohua student
xiaohei student
xiaoli student
在上面的示例中,名称和作业的长度实际上不一致。使用zip时,它会根据较短的zip自动为我们截断。如果我们不想截断它,也可以在itertools下使用zip[最长]而不是zip:
from itertools import zip_longest
for name, job in zip_longest(names, jobs):
这样,长度不足的元素将填充为“无”。Zip﹣length提供了一个参数fillvalue,可以用我们指定的值填充它。
无论是Zip还是Zip﹣long EST,它都可以支持多个迭代器的遍历。例如:

Zip不仅便于我们迭代,而且便于我们生成dict。例如,在刚才的例子中,如果我们想生成一个名称和职业的dict,一般的方法是先定义一个dict,然后遍历所有键和值来生成一个dict。但是,使用Zip,我们可以将这个操作简化为一行代码:
jobDict = dict(zip(names, jobs))
需要注意的是,我们调用zip的结果实际上是一个迭代器。当我们将其转换为dict时,我们会自动遍历迭代器的内容。例如,如果直接打印zip调用的结果,我们会发现屏幕上的输出是迭代器的地址:
print(zip(names, jobs))
>>> <zip object at 0x10ec93b40>
我们想要获得它的内容,需要将它手动转成list:
print(list(zip(names, jobs)))
>>> [('xiaoming', 'coach'), ('xiaohua', 'student'), ('xiaohei', 'student'), ('xiaoli', 'student')]
实际上,枚举和zip的底层都是基于迭代器实现的。原则上,没有深刻的内容,我们也不使用它们来编写代码。但Python之所以是Python,以及为什么许多人称之为简明语言和逻辑,是因为我们广泛使用这些工具和方法来简化代码逻辑。所以我们很有必要去理解它。我希望每个人都能写出Python IC的代码,Python IC不仅在编写代码方面很强大,而且本身也很漂亮。
Python专题之详解enumerate和zip的更多相关文章
- Python专题——详解enumerate和zip
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第7篇文章,我们继续介绍迭代相关. enumerate 首先介绍的是enumerate函数. 在我们日常编程的过程当 ...
- Python中dict详解
from:http://www.cnblogs.com/yangyongzhi/archive/2012/09/17/2688326.html Python中dict详解 python3.0以上,pr ...
- (转)python collections模块详解
python collections模块详解 原文:http://www.cnblogs.com/dahu-daqing/p/7040490.html 1.模块简介 collections包含了一些特 ...
- Python 字符串方法详解
Python 字符串方法详解 本文最初发表于赖勇浩(恋花蝶)的博客(http://blog.csdn.net/lanphaday),如蒙转载,敬请保留全文完整,切勿去除本声明和作者信息. ...
- python time模块详解
python time模块详解 转自:http://blog.csdn.net/kiki113/article/details/4033017 python 的内嵌time模板翻译及说明 一.简介 ...
- Python开发技术详解(视频+源码+文档)
Python, 是一种面向对象.直译式计算机程序设计语言.Python语法简捷而清晰,具有丰富和强大的类库.它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结 ...
- python/ORM操作详解
一.python/ORM操作详解 ===================增==================== models.UserInfo.objects.create(title='alex ...
- 【python进阶】详解元类及其应用2
前言 在上一篇文章[python进阶]详解元类及其应用1中,我们提到了关于元类的一些前置知识,介绍了类对象,动态创建类,使用type创建类,这一节我们将继续接着上文来讲~~~ 5.使⽤type创建带有 ...
- Python开发技术详解PDF
Python开发技术详解(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1F5J9mFfHKgwhkC5KuPd0Pw 提取码:xxy3 复制这段内容后打开百度网盘手 ...
随机推荐
- [C#.NET 拾遗补漏]09:数据标注与数据校验
数据标注(Data Annotation)是类或类成员添加上下文信息的一种方式,在 C# 通常用特性(Attribute)类来描述.它的用途主要可以分为下面这三类: 验证 Validation:向数据 ...
- IDEA2020.2的破解
第一种方式:http://code.39sd.cn/ 直接获取二维码: 第二种:下载破解工具(本方法只是提供个人学习使用) 1.下载2020.2的idea 链接:https://pan.baidu.c ...
- 用React 中的useState改变值不重新渲染的问题
不渲染 const [lists,setLists] =useState([]); ..... const arr = lists; arr.splice(index,1) //根据删除index下标 ...
- TP5自定义路由,为了安全性
1,入口文件index.php,不要指定任意模块,不然,自定义路由,就不会有任何效果哦 2,在配置文件 route.php 中引进 use think\Router 自带路由文件 3,将路由进 ...
- Kafka单机安装
一.Kafka简介 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的 分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作 ...
- K8S基础
四组基本概念 Pod/Pod控制器 Name/Namespace Label/Label选择器 Service/Ingress Pod Pod是k8s里能够被运行的最小的逻辑单元(原子单元) 1个Po ...
- 发布MeteoInfo 1.2.3
提升了对GeoTiff格式数据的读取能力(多个tiles).当然还有MeteoInfoLab功能的提升.下载地址:http://yun.baidu.com/share/link?shareid=669 ...
- day56 Pyhton 前端Jquery08
前端 内容回顾: -BOM -jquery介绍 -jquery下载和引入方式 npm install jquery -jquery的选择器 -基本选择器 -通配符选择器 - id选择器 - 类选择器 ...
- 我不信这篇文章能让你学会C语言,但是我还是想分享一下!
前言 C 语言是一门抽象的.面向过程的语言,C 语言广泛应用于底层开发,C 语言在计算机体系中占据着不可替代的作用,可以说 C 语言是编程的基础,也就是说,不管你学习任何语言,都应该把 C 语言放在首 ...
- 【C语言C++编程学习笔记】一种很酷的 C 语言技巧,灵活运用编程技巧让你写代码事半功倍!
C语言常常让人觉得它所能表达的东西非常有限.它不具有类似第一级函数和模式匹配这样的高级功能.但是C非常简单,并且仍然有一些非常有用的语法技巧和功能,只是没有多少人知道罢了. ☆ 指定的初始化 很多人都 ...