核心知识点:

(1)内置的zip函数可以平行地遍历多个迭代器。

(2)python3中地zip相当于生成器,会在遍历过程中逐次产生元祖。而python2中地zip则是直接把这些元祖完全生成好,并一次性地返回整份列表。

(3)如果提供地迭代器长度不等,那么zip就会自动提前终止。

(4)itertools内置模块中地zip_longest函数可以平行地遍历多个迭代器,而不用在乎它们地长度是否相等。

在编写python代码时,我们通常要面对很多列表,而这些列表里的对象,可能也是相互关联的。

通过列表推导式,很容易就能根据某个表达式从源列表推算出一份派生类表。

  1. >>> name_list
  2. ['kebi', 'maoxian', 'xiaoniao', 'xingye']
  3. >>> letters = [len(n) for n in name_list]

对于本例中的派生列表和源列表来说,相同索引处的两个元素之间有着关联。

如果要平行地迭代这两份列表,那么可以根据name_list源列表的长度来执行循环。

  1. >>> name_list
  2. ['kebi', 'maoxian', 'xiaoniao', 'xingye']
  3. >>> letters = [len(n) for n in name_list]
  4. >>> longest_name = None
  5. >>> max_letters = 0
  6. >>> for i in range(len(name_list)):
  7. ... count = letters[i]
  8. ... if count > max_letters:
  9. ... longest_name = name_list[i]
  10. ... max_letters = count
  11. ...
  12. >>> print(longest_name)
  13. xiaoniao

上面这段代码的问题在于,整个循环语句看上去很乱。用下标来访问name_list和letters会使代码不易阅读。

用循环下标i来访问数组的写法一种出现了两次,改用enumerate来做可以稍稍缓解这个问题,但仍然不够理想。

  1. >>> for i,name in enumerate(name_list):
  2. ... count = letters[i]
  3. ... if count > max_letters:
  4. ... longest_name = name
  5. ... max_letters = count
  6. ...

使用python内置的zip函数,能够令上述代码变得更为简洁。

在python3中的zip函数,可以把两个或者两个以上的迭代器封装成生成器,以便稍后求值。

这种zip生成器,会从每个迭代器中获取该迭代器的下一个值,然后把这些值汇聚成一个元祖(tuple)。

与通过下标来访问多份列表的那种写法相比,这种用zip写出来的代码更加清晰。

  1. >>> for name,count in zip(name_list,letters):
  2. ... if count > max_letters:
  3. ... longest_name = name
  4. ... max_letters = count

内置函数zip有两个问题。

第一个问题是,python2中的zip并不是生成器,而是会把开发者所提供的那些迭代器,都平行的遍历一次,

在此过程中,它都会把那些迭代器所产生的值汇聚成元祖,并把那些元祖所构成的列表完整的返回给调用者。

这可能会占用大量内存并导致程序崩溃。如果要在python2里面用zip来遍历数据量非常大的迭代器,那么应该使用itertools内置模块中的izip函数。

第二个问题是,如果输入的迭代器长度不同,那么zip会表现出奇怪的行为。

文章摘抄于Brett Slatkin的《编写高质量Python代码的59个有效方法》,仅作为个人学习使用,如有侵权请告知,将及时删除,如果觉得有益,请购买原版书籍,知识需要传递和支持,谢谢。

第11条:用zip函数同时遍历两个迭代器的更多相关文章

  1. Python的range、enumerate和zip函数用法

    range函数可创建一个整数列表.如果需要知道当前元素在列表中的索引,推荐用enumerate代替range.zip函数用于同时遍历多个迭代器. 一.range 函数 range函数可创建一个整数列表 ...

  2. python之zip函数和sorted函数

    # zip()函数和sorted()函数 # zip()函数:将两个序列合并,返回zip对象,可强制转换为列表或字典 # sorted()函数:对序列进行排序,返回一个排序后的新列表,原数据不改变 # ...

  3. python zip函数(11)

    一.zip函数描述和使用 zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,返回的结果可以直接强转为list列表,这样做的好处是节约了不少的 ...

  4. Python:zip 函数的用法

    zip() 接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个 tuple,然后返回由这些 tuple 组成的 list. 若传入参数的长度不等,则返回 list 的长度和参数中长度最短的 ...

  5. 【外】001-python3之zip函数

    zip函数语法格式zip(可迭代对象1, 可迭代对象2, ... ,可迭代对象n) 函数接收任意个可迭代对象作为参数, 将所有对象中对应位置上的元素分别打包在一起组成一个tuple, 并将所有的tup ...

  6. python中使用zip函数出现<zip object at 0x02A9E418>

    在Python中使用zip函数,出现<zip object at 0x02A9E418>错误的原因是,你是用的是python2点多的版本,python3.0对python做了改动 zip方 ...

  7. python中的 zip函数详解

    python中zip()函数用法举例 定义:zip([iterable, ...]) zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple ...

  8. Pythonh中的zip()与*zip()函数详解

    前言 实验环境: Python 3.6: 示例代码地址:下载示例: 本文中元素是指列表.元组.字典等集合类数据类型中的下一级项目(可能是单个元素或嵌套列表). zip(*iterables)函数详解 ...

  9. python中的zip()函数和map()函数

    一.zip()函数 1.语法: zip(iterable, ...) 参数说明: iterable,...-- 一个或多个迭代器; 在python2中: zip() 函数用于将可迭代的对象作为参数,将 ...

随机推荐

  1. react-native 详解

    1.获取主屏幕尺寸 // 导入类库 var Dimensions = require('Dimensions'); // 样式 const styles = StyleSheet.create({ c ...

  2. Android 创建Listener监听器形式选择:匿名内部类?外部类?

    说到监听器,第一感觉就是直接写作匿名内部类来用,可是依据单一职责原则,好像又不应该作为匿名内部类来写(由于监听中有时要写较多的逻辑代码),所曾经段时间把有共性的listener单独创建放在glut.l ...

  3. SQLserver备份数据库示例

     BACKUP DATABASE [yee]TO  DISK = N'D:\数据库备份\yee2015.9.11.bak'WITH  NAME = N'yee - 备份',  NOFORMAT, NO ...

  4. MyBatis学习小结

    一款轻量级的ORM框架 全局配置文件 SqlMapConfig.xml <?xml version="1.0" encoding="UTF-8" ?> ...

  5. Session和Cookie之间存在的区别与联系

    一. 概念理解 你可能有留意到当你浏览网页时,会有一些推送消息,大多数是你最近留意过的同类东西,比如你想买桌子,上淘宝搜了一下,结果连着几天会有各种各样的桌子的链接.这是因为 你浏览某个网页的时候,W ...

  6. c#利用委托传递函数参数(1)

    本次旨在解决 同参不同名 的函数作为参数传递的情况 情景: 一下两个函数分别多次重复调用了两个同参不同名的函数(实际上总共有3个这样的函数),函数结构基本相同,只有调用的函数名不一样,显然可以整合在一 ...

  7. 操作符(运算符)重载 或者叫 二元运算符 operator + 与 转换式操作符 implicit operator explicit operator

    static void Main(string[] args) { rational r1 = new rational(5); rational r2 = new rational(51); rat ...

  8. Wd 西部数据

    西部数据 https://item.jd.com/3564471.html#none 打算买一个大硬盘记录代码片段.开发项目.开发工具.电影游戏等…… /** * 获取100天后的日子 * 用来做计划 ...

  9. Viewer 是一款强大的 jQuery 图像浏览插件。

    Viewer 是一款强大的 jQuery 图像浏览插件. 主要功能: 支持选项 支持方法 支持事件 支持触摸 支持移动 支持缩放 支持旋转 支持键盘 跨浏览器支持 链接: viewer的官方演示,及g ...

  10. nginx 常见参数以及重定向参数配置

    nginx 各参数翻译,作用 $arg_PARAMETER #这个变量包含GET请求中,如果有变量PARAMETER时的值. $args #这个变量等于请求行中(GET请求)的参数,例如foo=123 ...