• 第11条:用zip函数同时遍历两个迭代器


    核心知识点:

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

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

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

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

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

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

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

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

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

    >>> name_list
    ['kebi', 'maoxian', 'xiaoniao', 'xingye']
    >>> letters = [len(n) for n in name_list]
    >>> longest_name = None
    >>> max_letters = 0
    >>> for i in range(len(name_list)):
    ...     count = letters[i]
    ...     if count > max_letters:
    ...         longest_name = name_list[i]
    ...         max_letters = count
    ... 
    >>> print(longest_name)
    xiaoniao

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

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

    >>> for i,name in enumerate(name_list):
    ...     count = letters[i]
    ...     if count > max_letters:
    ...         longest_name = name
    ...         max_letters = count
    ... 

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

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

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

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

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

    内置函数zip有两个问题。

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

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

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

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

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

  • 相关阅读:
    基本IO流
    解决重载logf4j2配置文件问题
    vue-element-admin(1)
    asp.net 获取客服端ip,服务端ip
    页面传值
    C#基本语法复习-使用索引器
    C#基本语法复习-属性
    C#基本语法复习-使用垃圾回收和资源管理
    C#基本语法复习-创建接口和定义抽象类
    C#基本语法复习-使用继承
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/8018703.html
Copyright © 2020-2023  润新知