Effective Python 小笔记之 zip 函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Effective Python 小笔记之 zip 函数相关的知识,希望对你有一定的参考价值。

环境:Python 3.5.1

    CentOS 7

zip函数可以同时遍历两个迭代器。

在编写Python代码时,通常要面对很多列表,而这些列表中的对象,可能是相互关联的。如下例:

    names = [‘Cecilia‘, ‘Lily‘, ‘Maria‘]
    length = [len(word) for word in names]

       对于上例中的源列表和派生列表,相同索引处有关联关系,以此再引申出一个例子:

    longest_name = None
    max_length = 0
    
    for i in range(len(names)):
        count = length[i]
        if count > max_length:
            longest_name = names[i]
            max_length = count
            
    print(longest_name)
    >>>
    Cecilia

以上代码的问题在于,整个循环语句看起来很乱。使用下标来访问names和length会使代码不易阅读。改用enumerate,可以稍稍缓解这个问题,但仍不理想。

   for i, name in enumerate(names):
       count = length[i]
       if count > max_length:
           longest_name = name
           max_length = count

使用Python内置zip函数,能使上述代码变得简洁。在Python 3 中的zip函数,可以把两个或两个以上的迭代器封装成生成器。这种zip生成器,会从每个迭代器中获取该迭代器的下一个值,然后将这些值汇聚成元组(tuple)。

   for name, count in zip(names, length):
       if count > max_length:
           longest_name = name
           max_length = count

另,Python 3内置的zip函数有一个问题,如果输入的迭代器长度不同,zip会表现的很奇怪。例如,当给names添加一个名字,但没有更新length。现在,如果使用zip同时遍历这两个列表,会产生意外的结果。

   names.append(‘Song‘)
   for name, count in zip(names, length):
       print(name)
   >>>
   Cecilia
   Lily
   Maria

新元素‘song’并没有出现在遍历结果中。受封装的那些迭代器中,只要一个耗尽, zip 将不再产生元组。若待遍历的迭代器长度不同,那么 zip 会提前终止。若不能确定 zip 封装的列表是否等长,则可考虑使用 itertools 内置模块中的 zip_longest 函数。

以上是关于Effective Python 小笔记之 zip 函数的主要内容,如果未能解决你的问题,请参考以下文章

python开发笔记之zip()函数用法详解

Effective Java 读书笔记之八 异常

Effective Python2 读书笔记2

Effective Java 读书笔记之六 方法

Java:Effective java学习笔记之 考虑实现Comparable 接口

Effective Java 读书笔记之四 泛型