码迷,mamicode.com
首页 > 编程语言 > 详细

Effective Python 小笔记之 zip 函数

时间:2016-05-19 19:41:54      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:effecti python

环境: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 函数

标签:effecti python

原文地址:http://jaydenwen.blog.51cto.com/8079623/1775017

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!