1 描述

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。

也即:返回一个zip对象,此对象用于生成元组,此元组的个数由最小的可迭代对象决定

2 语法

zip([iterable/iterator, iterable/iterator, ...])

参数

iterable/iterator可以是迭代对象,也可以是迭代器

参数个数不限制,可以为一个,也可以是多个元素,

3 返回值

返回由元组为元素构成的对象——这是在python3中的现象

python3中的运行结果

>>> zip([1,2,3],[4,5,6])
<zip object at 0x7fcc3a709088>

python2中运行的结果

>>> a = zip([1,2,3],[4,5,6])
>>> a
[(1, 4), (2, 5), (3, 6)]
>>> print(a)
[(1, 4), (2, 5), (3, 6)]

返回值的长度取决于元素中长度最短的那个对象

只有一个序列参数时,它返回一个1元组的列表。

names = ["中国移动", "中国电信", "中国联通"]
for x in zip( names):
    print(x)

运行

('中国移动',)
('中国电信',)
('中国联通',)

4 实例

实例一:元素为迭代对象,迭代对象长度不一致

numbers = [10086, 10000, 10010, 95588]
names = ["中国移动", "中国电信", "中国联通"]
for x in zip(numbers, names):
    print(x)

for x in zip(range(1,10000), numbers, names):
    print(x)

运行

(10086, '中国移动')
(10000, '中国电信')
(10010, '中国联通')
(1, 10086, '中国移动')
(2, 10000, '中国电信')
(3, 10010, '中国联通')

注解:当zip()函数中的迭代对象长度不一致时,zip()返回值中元素长度与最短长度一致

实例二 含有迭代器的元素对象

numbers = [10086, 10000, 10010, 95588]
names = ["中国移动", "中国电信", "中国联通"]
z1 = zip(numbers, names)
for x in z1:
    print(x)

for x in zip(range(1,10000), iter(numbers), iter(names)):
    print(x)

运行

(10086, '中国移动')
(10000, '中国电信')
(10010, '中国联通')
(1, 10086, '中国移动')
(2, 10000, '中国电信')
(3, 10010, '中国联通')

实例三 含有迭代器的元素对象

numbers = iter([10086, 10000, 10010, 95588])
names = ["中国移动", "中国电信", "中国联通"]
z1 = zip(numbers, names)
for x in z1:
    print(x)

for x in zip(range(1,10000), numbers, names):
    print(x)

运行

(10086, '中国移动')
(10000, '中国电信')
(10010, '中国联通')

实例二和实例三中都使用了迭代器,而实际运行结果却相差较大,主要原因是迭代器的特点决定的,迭代器只能一直向后执行,不能后退;

在实例三中第一个for循环已经使用了迭代器numbers,所以再次执行时,不是从起始位置开始的,而是从上一个“指针”位置进行的。

为了更能说明问题,将代码修改进行

numbers = iter([11111, 10086, 10000, 10010, 22222, 33333, 44444, 55555, 66666,77777])
names = ["中国移动", "中国电信", "中国联通"]

print(next(numbers))

for x in zip(numbers, names):
    print(x)

print(next(numbers))

for x in zip(range(1,10000), iter(numbers), names):
    print(x)

运行结果

11111
(10086, '中国移动')
(10000, '中国电信')
(10010, '中国联通')
33333
(1, 44444, '中国移动')
(2, 55555, '中国电信')
(3, 66666, '中国联通')

这里面有一个问题一直没有解决,为什么zip()函数调用迭代器后,迭代器中“指针”跳过了元素22222,现在暂时没有找到原因。可能得在zip()源代码中找答案了。个人觉得在zip()函数中能不用迭代器就不用迭代器

实例四

a = [1, 2, 3]
b = [4, 5, 6]

for (x, y) in zip(a, b):
    print(x,"*",y,"=",    x * y)

运行

1 * 4 = 4
2 * 5 = 10
3 * 6 = 18

补充

numbers = [10086, 10000, 10010, 95588]
names = ['中国移动','中国电信','中国联通']

for x in zip(numbers,names):
    print(x)

print("---------------------------")
for x in zip(range(1,1000),numbers,names):
    print(x)

print("---------------------------")
for x,y,z in zip(range(1,1000),numbers,names):
    print("x:",x,'y:',y,'z:',z)

运行

(10086, '中国移动')
(10000, '中国电信')
(10010, '中国联通')
---------------------------
(1, 10086, '中国移动')
(2, 10000, '中国电信')
(3, 10010, '中国联通')
---------------------------
x: 1 y: 10086 z: 中国移动
x: 2 y: 10000 z: 中国电信
x: 3 y: 10010 z: 中国联通

对于 for x,y,z in zip(range(1,1000),numbers,names): 变量不对应,出现过多或者过少均不行

例如

numbers = [10086, 10000, 10010, 95588]
names = ['中国移动','中国电信','中国联通']

for x,y in zip(range(1,1000),numbers,names):
    print("x:",x,'y:',y)

运行

Traceback (most recent call last):
  File "test.py", line 4, in <module>
    for x,y in zip(range(1,1000),numbers,names):
ValueError: too many values to unpack (expected 2)

numbers = [10086, 10000, 10010, 95588]
names = ['中国移动','中国电信','中国联通']

for x,y,z,k in zip(range(1,1000),numbers,names):
    print("x:",x,'y:',y,'z:',z)

运行

Traceback (most recent call last):
  File "test.py", line 5, in <module>
    for x,y,z,k in zip(range(1,1000),numbers,names):
ValueError: not enough values to unpack (expected 4, got 3)

Python学习笔记014——迭代工具函数 内置函数zip()的更多相关文章

  1. Python学习笔记014——迭代工具函数 内置函数enumerate()

    1 描述 enumerate() 函数用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中. 2 语法 enumerate(sequ ...

  2. python学习笔记:第14天 内置函数补充和递归

    一.匿名函数 匿名函数主要是为了解决一些简单需求而设计的一种函数,匿名函数的语法为: lambda 形参: 返回值 先来看一个例子: # 计算n的n次方 In[2]: lst = lambda n: ...

  3. python学习笔记(十六)内置函数zip、map、filter的使用

    1.zip,就是把两个或者多个list,合并到一起,如果想同时循环2个list的时候,就使用zip.示例如下: l1 = ['a','b','c','e','f','g'] l2 = [,,] l3= ...

  4. python学习笔记:第13天 内置函数(一)

    详细文件查看点击这里:详细地址

  5. 记录我的 python 学习历程-Day12 生成器/推导式/内置函数Ⅰ

    一.生成器 初识生成器 生成器的本质就是迭代器,在python社区中,大多数时候都把迭代器和生成器是做同一个概念. 唯一的不同就是: 迭代器都是Python给你提供的已经写好的工具或者通过数据转化得来 ...

  6. 老男孩python学习自修第十一天【内置函数】

    1.基本内置函数 help() 帮助文档 dir() 列出当前文件的所有变量和方法 vars() 列出当前文件的所有变量及其值 type() 返回变量的类型 id() 返回变量的内存地址 len() ...

  7. Python学习进程(15)常用内置函数

        本节介绍Python的一些常用的内置函数.     (1)cmp(x, y): cmp()函数比较 x 和 y 两个对象,并根据比较结果返回一个整数,如果 x<y,则返回-1:如果x&g ...

  8. sqlserver学习笔记(六)—— sqlserver内置函数(字符串、日期)

    sqlserver中有很多内置函数,这里总结了一些常用的 一.关于字符串的函数: 1.CHARINDEX 寻找一个指定字符串在另一个字符串中的起始位置 SELECT CHARINDEX('world‘ ...

  9. python的学习笔记之——time模块常用内置函数

    1.Python time time()方法 Python time time() 返回当前时间的时间戳(1970纪元后经过的浮点秒数). time()方法语法: time.time() 举例: #! ...

随机推荐

  1. 3D有向包围盒与球体碰撞的算法

    之前发的小游戏滚蛋躲方块中,用它来判断球体与立方体是否发生了碰撞. http://www.cnblogs.com/WhyEngine/p/3350012.html 现在发布下该算法: 有向包围盒OBB ...

  2. C#操作AD及Exchange Server总结(一)

    这篇博客的目的:根据亲身项目经历,总结对AD及Exchange Server的操作,包括新建AD用户,设置密码,为AD用户创建邮箱等. 本文完全原创,转载请说明出处,希望对大家有用. 文档目录: 测试 ...

  3. 以AVL树为例理解二叉树的旋转(Rotate)操作

    树旋转是在二叉树中的一种子树调整操作, 每一次旋转并不影响对该二叉树进行中序遍历的结果. 树旋转通常应用于需要调整树的局部平衡性的场合. 树旋转包括两个不同的方式, 分别是左旋转和右旋转. 两种旋转呈 ...

  4. X86-64寄存器和栈帧

    简介 通用寄存器可用于传送和暂存数据,也可参与算术逻辑运算,并保存运算结果.除此之外,它们还各自具有一些特殊功能.通用寄存器的长度取决于机器字长,汇编语言程序员必须熟悉每个寄存器的一般用途和特殊用途, ...

  5. Jmeter-Maven-Plugin高级应用:Remote Server Configuration

    Remote Server Configuration Pages 12 Home Adding additional libraries to the classpath Advanced Conf ...

  6. Python批量处理CSV文件

    #encoding: utf-8 __author__ = 'DELL' import csv import glob import datetime import sys import os rel ...

  7. C#.NET常见问题(FAQ)-想要另存一个项目,sln文件丢了怎么办,如何打开高版本的项目

    如下图所示,我想要另存一个工程,把 V4.4整个的项目另存为V4.5,我可以把解决方案文件(.sln)改名字,但是我没法把文件夹改名字,改了打开sln就说找不到.   很简单的一个思路是反正sln是多 ...

  8. C语言高速入门系列(二)

    C语言高速入门系列(二) -----转载请注明出处coder-pig 本节引言: 在前面一节中我们对C语言进行了初步的了解,学会了使用IDE进行代码的编写,编译执行! 在这一节中我们会对C语言的基本的 ...

  9. ADO.Net 之 数据库连接池(二)

    连接到数据库服务器通常由几个需要很长时间的步骤组成.必须建立物理通道(例如套接字或命名管道),必须与服务器进行初次握手,必须分析连接字符串信息,必须由服务器对连接进行身份验证,必须运行检查以便在当前事 ...

  10. C++生成十字绣图案(二) 面向对象

    基本的十字绣线性生成中提供了判断下一步可以画的位置并且逐步生成的函数.以这些基本函数为基础,可以进行更多变化的图案设计. 为了方便的扩展,可以把线性生成写成一个类,以后的修改继承这个类. 头文件Bas ...