Python 的迭代器与zip详解

 更新时间:2021年11月03日 15:19:16   作者:埠默笙声声声脉  
本篇文章主要介绍Python 的迭代器与zip,可迭代对象的相关概念,有需要的小伙伴可以参考下,希望能够给你带来帮助

首先抛出一个困扰本人许久的问题:

nums = [1,2,3,4,5,6]
numsIter = iter(nums)
for _ in zip(*[numsIter]*3):
    print(_)
print(list(numsIter))

则控制台输出如何?

关于迭代器

1.对于支持迭代的集合对象,可以创建其迭代器对象。迭代器对象储存了可迭代对象的地址和遍历的位置,迭代器对象从集合的第一个元素开始访问,所有的元素被访问完迭代器被消耗(仍然占地址),但清空储存的信息(即地址和遍历位置)。使用list()函数或 * 操作符可以获取所有遍历的内容,结束后迭代器被消耗。

nums = [1,2,3,4,5,6]
numsIter = iter(nums)
print(nums)
print(list(nums))
print(nums)
print(list(nums))

输出为:

<list_iterator object at 0x00000205944619D0>
[1,2,3,4,5,6]
<list_iterator object at 0x00000205944619D0>
[]

第二次键入 print(list(nums)) 时输出为空,因为迭代器对象已经找不到地址了。

2.复制迭代器对象,得到的是一个迭代器对象的引用,即地址,而不是新建一个迭代器。因此,遍历位置是共同的。

nums = [1,2,3,4,5,6]
numsIter = iter(nums)
numsIter_list = [numsIter] * 2
print(numsIter)
print(numsIter_list)

for _ in numsIter_list:
    print(next(_))

 输出为:

<list_iterator object at 0x0000020594445A00>
[<list_iterator object at 0x0000020594445A00>, <list_iterator object at 0x0000020594445A00>]
1
2

关于zip

1.在创建zip对象时,并没有直接生成新数据,而是存储了要操作对象的迭代器,当真正需要的时候,才通过迭代器遍历数据。因此,当使用list()函数或 * 操作符解压zip对象时,当然是会消耗掉储存的迭代器,使得再一次解压时返回为空。

P = [1,2,3]
Q = [4,5,6]
PQ_zip = zip(P,Q)
print(PQ_zip)
print(list(PQ_zip))
print(list(PQ_zip))

 输出为:

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

2.zip之所以能work,就是利用了迭代器储存的遍历位置,逐一地获取数据,直到其中一个迭代器被消耗掉。文首的问题就是最好的例子 。

nums = [1,2,3,4,5,6]
numsIter = iter(nums)
for _ in zip(*[numsIter]*3):
    print(_)
print(list(numsIter))

 输出为:

(1, 2, 3)
(4, 5, 6)
[]

可以看见,实现的功能是把单行数据变成了3列2行。这是怎么做到的呢?执行zip时,依次访问三个同样的迭代器,每次访问,迭代器的遍历位置都会加1,于是第一轮结束后zip获取了(1,2,3),同理第二轮则获取了(4,5,6),随后迭代器被消耗。第三轮zip对象已经没有迭代器可用,于是结束执行。最后 print(list(numsIter)) 发现迭代器确实已经被消耗。

3.当使用 print 显示迭代器或zip对象的内容时,list() 和 * 操作符几乎没有区别。但上述例子中,只能用 * 操作符来实现,因为 * 操作符实际上是返回对象的地址和遍历位置,而 list() 会直接遍历完毕从而消耗掉迭代器。

nums = [1,2,3]
numsIter = iter(nums)
print(numsIter)
for _ in zip(list(numsIter)*3):
    print(_)
print(list(numsIter))

输出为:

 <list_iterator object at 0x0000020594445B80>
(1,)
(2,)
(3,)
(1,)
(2,)
(3,)
(1,)
(2,)
(3,)
[]

总结:

在熟悉迭代器和zip()函数的同时,掌握了一个将一维数据变为二维数据的方法。

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • Python实现发送邮件到自己邮箱

    Python实现发送邮件到自己邮箱

    在日常开发中,我们经常需要监控应用程序的状态,及时发现问题并采取措施解决。而通过邮件发送报警信息则是一种常见的实现方式。本文就来介绍一下Python实现发送邮件到自己邮箱的方法
    2023-04-04
  • Python中类的初始化特殊方法

    Python中类的初始化特殊方法

    本文给大家介绍一下Python中类才初始化时候的特殊方法,通过实例给大家做了分析,一起来学习下。
    2017-12-12
  • Python脚本实现一键自动整理办公文件

    Python脚本实现一键自动整理办公文件

    这篇文章主要介绍了Python实现脚本一键自动整理办公文件,文件下载文件夹就变得乱七八糟,整理的时候非常痛苦,巴不得有一个自动化的工具帮我归类文档。下面小编就给大家分享自动化整理文件的小技巧,需要的朋友可以参考一下文章内容
    2022-02-02
  • Python实现APP自动化发微信群消息的示例代码

    Python实现APP自动化发微信群消息的示例代码

    本文主要介绍了Python实现APP自动化发微信群消息的示例代,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下码
    2022-01-01
  • Python缩进和冒号详解

    Python缩进和冒号详解

    下面小编就为大家带来一篇Python缩进和冒号详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • Python turtle库(绘制螺旋正方形)

    Python turtle库(绘制螺旋正方形)

    这篇文章主要介绍了Python turtle库(绘制螺旋正方形),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Python脚本实现图片文件批量命名

    Python脚本实现图片文件批量命名

    这篇文章主要为大家详细介绍了一个用python第三方库pillow写的批量处理图片命名的脚本,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2025-02-02
  • python 使用opencv 把视频分割成图片示例

    python 使用opencv 把视频分割成图片示例

    今天小编就为大家分享一篇python 使用opencv 把视频分割成图片示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • Python3环境安装Scrapy爬虫框架过程及常见错误

    Python3环境安装Scrapy爬虫框架过程及常见错误

    这篇文章主要介绍了Python3环境安装Scrapy爬虫框架过程及常见错误 ,本文给大家介绍的非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • Python实现图片格式转换

    Python实现图片格式转换

    经常会遇到图片格式需要转换的情况,这篇文章主要为大家详细介绍了Python实现图片格式转换,文中示例代码介绍的非常详细、实用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08

最新评论