首页 后端开发 Python教程 关于Python中的range 对象是不是迭代器的探讨

关于Python中的range 对象是不是迭代器的探讨

Apr 02, 2018 pm 02:28 PM
python

迭代器(iterator)是惰性可迭代对象(lazy iterable),range 函数在 Python 3 中是一个惰性的可迭代对象,那么 range 是不是迭代器呢?为什么。

TLNR:Python 3 中的 range 对象(Python 2 中的 xrange 对象)是 lazy 的,但 range 对象却不是迭代器。



是的,这让人很困惑

当谈论 Python 中的迭代器(iterator)和可迭代对象(iterable)时,你很可能会听到有人重复 range 是迭代器的误解。我认为这是非常严重误解, 如果你认为 range 对象是迭代器,那么你关于「迭代器是如何运行」的心智模型还不够清楚。从某种意义上来说,range 和迭代器都是「惰性」的,但它们是以相当不同的方式实现「惰性」的。


什么是迭代器(iterator)

在 Python 中,可迭代对象就是你可以迭代的任何东西,而迭代器就是实际迭代的东西。

Iter-ables are able to be iterated over. Iter-ators are the agents that perform the iteration.

可以使用 iter 函数从任何可迭代对象中获取迭代器:

360截图20180402142325097.jpg

一旦有了迭代器,可以用它做的唯一的事情就是获得它的下一个元素:

360截图20180402142348225.jpg

如果没有更多的元素了, 则会抛出一个 stop iteration exception:

360截图20180402142409624.jpg

所有的迭代器都是可迭代对象,意思是你可以从一个迭代器中得到一个迭代器,因此你可以遍历一个迭代器:

360截图20180402142432168.jpg

应该指出的是迭代器是有状态的,在循环遍历一次迭代器后,如果尝试再次循环,它将为空:

360截图20180402142451282.jpg

在 Python 3 中,<span style="color: rgb(103, 103, 103);">enumerate、zip、reversed</span>和其他一些内置函数会返回迭代器:

360截图20180402142505393.jpg

生成器(无论来自生成器函数还是生成器表达式)是一种创建迭代器的简单方法:

360截图20180402142530097.jpg

我经常说迭代器是惰性的一次性可迭代对象。 「惰性」是因为他们只循环计算项目,「单次使用是因为一旦从一个迭代器中「消费」了一个元素之后,这个元素就永远消失了。


什么是 range

Python 3 中的 range 对象(Python 2 中的 xrange)可以像任何其他可迭代对象一样循环使用:

360截图20180402142555040.jpg

因为 range 是可迭代对象,所以可以从中得到一个迭代器:

f2a4c45edca4ad776dec08f851c2c3c1_640_wx_fmt=jpeg.jpg

但 range 对象本身不是迭代器,我们不能在 range 对象上调用 next:

d272462c617bbb2343927048a78f0acc_640_wx_fmt=jpeg.jpg

与迭代器不同的是,我们可以遍历一个 range 对象而不「消耗」它:

78b9b7bcdcfd8311217eddf94370e2ed_640_wx_fmt=jpeg.jpg

如果我们使用迭代器完成此操作,则第二次循环时不会得到任何元素:

594254f3b36088165232b56391941a27_640_wx_fmt=jpeg.jpg

宗上,与 <span style="color: rgb(103, 103, 103);">zip</span><span style="color: rgb(103, 103, 103);">enumerate</span>, or <span style="color: rgb(103, 103, 103);">generator</span>对象不同,range 对象不是迭代器。


那么,究竟 range 是什么

range 对象在某种意义上是「惰性的」,因为它不会生成创建时包含的每个数字,相反,当我们在循环中需要的时候,它才将这些数字返回给我们。

下面是一个 range 对象和一个生成器(是一种迭代器):

bf71c628c7b763250fbb476ed05f0fbb_640_wx_fmt=jpeg.jpg

不像生成器,range 对象有长度:

b832b3cfea96e9bdf15d01b5483be516_640_wx_fmt=jpeg.jpg

并且可以被索引:

bf240fc1b2fa3569835e2cdaf4c8c2bf_640_wx_fmt=jpeg.jpg

与迭代器不同,你可以询问他们是否包含某元素而不改变他们的状态:

69b757a6a321619c48ae27bfdd33b5d7_640_wx_fmt=jpeg.jpg

如果你想要一个 range 对象的描述,可以称它们为<span style="color: rgb(103, 103, 103);">懒序列</span>,range 是序列(如列表,元组和字符串),但并不包含任何内存中的内容,而是通过计算来回答问题。

bc66721ae72b6f5dba23973e65433c35_640_wx_fmt=jpeg.jpg


为什么这个区别很重要

如果我告诉你某个对象是一个迭代器,你会知道当在这个对象上调用 iter 函数时,总会得到相同的的对象(按照定义):

e1b59616414d402954842aa414bd3c00_640_wx_fmt=jpeg.jpg

确信可以在这个对象上调用 next 函数,因为可以在所有的迭代器上调用 next 函数:

9c3a0a98bbc79d00817ecb66c83f6e88_640_wx_fmt=jpeg.jpg

而且你会知道,当遍历它时,这些元素将从迭代器中被消耗掉,有时候这个特性可以派上用场(以特殊的方式处理迭代器):

02e7da49e553af09b9e1cb63ee1b1614_640_wx_fmt=jpeg.jpg

所以虽然看起来「惰性可迭代对象」和「迭代器」之间的区别很微妙,但这些术语确实意味着不同的东西。 虽然「惰性可迭代对象」是一个没有具体含义的非常普遍的术语,但「迭代器」这个词意味着一个具有非常特定行为的对象。


总结

如果你知道你可以循环遍历某个对象,这是一个可迭代对象(iterable)。

如果你知道你正在循环遍历的对象是在循环的时候计算出来,那么这是一个惰性可迭代对象(lazy iterable)。

如果你知道你可以传递一些东西给 next 函数,它就是一个迭代器(这是最常见的惰性可迭代对象)。

如果你可以循环多次而不用「耗尽」它,它不是一个迭代器。如果你不能将某些东西传递给 next 函数,那么它不是一个迭代器。 Python 3 的 range 对象不是迭代器。 如果你正在指导别人关于 range 对象的知识,请不要使用「迭代器」一词,这会让人十分困惑,并可能导致他人开始滥用「迭代器」这个词

相关推荐:

关于迭代器的详细说明

Python中可迭代对象和迭代器对象的理解

Range对象

以上是关于Python中的range 对象是不是迭代器的探讨的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

PHP和Python:代码示例和比较 PHP和Python:代码示例和比较 Apr 15, 2025 am 12:07 AM

PHP和Python各有优劣,选择取决于项目需求和个人偏好。1.PHP适合快速开发和维护大型Web应用。2.Python在数据科学和机器学习领域占据主导地位。

CentOS上如何进行PyTorch模型训练 CentOS上如何进行PyTorch模型训练 Apr 14, 2025 pm 03:03 PM

在CentOS系统上高效训练PyTorch模型,需要分步骤进行,本文将提供详细指南。一、环境准备:Python及依赖项安装:CentOS系统通常预装Python,但版本可能较旧。建议使用yum或dnf安装Python3并升级pip:sudoyumupdatepython3(或sudodnfupdatepython3),pip3install--upgradepip。CUDA与cuDNN(GPU加速):如果使用NVIDIAGPU,需安装CUDATool

Python vs. JavaScript:社区,图书馆和资源 Python vs. JavaScript:社区,图书馆和资源 Apr 15, 2025 am 12:16 AM

Python和JavaScript在社区、库和资源方面的对比各有优劣。1)Python社区友好,适合初学者,但前端开发资源不如JavaScript丰富。2)Python在数据科学和机器学习库方面强大,JavaScript则在前端开发库和框架上更胜一筹。3)两者的学习资源都丰富,但Python适合从官方文档开始,JavaScript则以MDNWebDocs为佳。选择应基于项目需求和个人兴趣。

CentOS上PyTorch的GPU支持情况如何 CentOS上PyTorch的GPU支持情况如何 Apr 14, 2025 pm 06:48 PM

在CentOS系统上启用PyTorchGPU加速,需要安装CUDA、cuDNN以及PyTorch的GPU版本。以下步骤将引导您完成这一过程:CUDA和cuDNN安装确定CUDA版本兼容性:使用nvidia-smi命令查看您的NVIDIA显卡支持的CUDA版本。例如,您的MX450显卡可能支持CUDA11.1或更高版本。下载并安装CUDAToolkit:访问NVIDIACUDAToolkit官网,根据您显卡支持的最高CUDA版本下载并安装相应的版本。安装cuDNN库:前

docker原理详解 docker原理详解 Apr 14, 2025 pm 11:57 PM

Docker利用Linux内核特性,提供高效、隔离的应用运行环境。其工作原理如下:1. 镜像作为只读模板,包含运行应用所需的一切;2. 联合文件系统(UnionFS)层叠多个文件系统,只存储差异部分,节省空间并加快速度;3. 守护进程管理镜像和容器,客户端用于交互;4. Namespaces和cgroups实现容器隔离和资源限制;5. 多种网络模式支持容器互联。理解这些核心概念,才能更好地利用Docker。

CentOS下PyTorch版本怎么选 CentOS下PyTorch版本怎么选 Apr 14, 2025 pm 02:51 PM

在CentOS下选择PyTorch版本时,需要考虑以下几个关键因素:1.CUDA版本兼容性GPU支持:如果你有NVIDIAGPU并且希望利用GPU加速,需要选择支持相应CUDA版本的PyTorch。可以通过运行nvidia-smi命令查看你的显卡支持的CUDA版本。CPU版本:如果没有GPU或不想使用GPU,可以选择CPU版本的PyTorch。2.Python版本PyTorch

minio安装centos兼容性 minio安装centos兼容性 Apr 14, 2025 pm 05:45 PM

MinIO对象存储:CentOS系统下的高性能部署MinIO是一款基于Go语言开发的高性能、分布式对象存储系统,与AmazonS3兼容。它支持多种客户端语言,包括Java、Python、JavaScript和Go。本文将简要介绍MinIO在CentOS系统上的安装和兼容性。CentOS版本兼容性MinIO已在多个CentOS版本上得到验证,包括但不限于:CentOS7.9:提供完整的安装指南,涵盖集群配置、环境准备、配置文件设置、磁盘分区以及MinI

CentOS上PyTorch的分布式训练如何操作 CentOS上PyTorch的分布式训练如何操作 Apr 14, 2025 pm 06:36 PM

在CentOS系统上进行PyTorch分布式训练,需要按照以下步骤操作:PyTorch安装:前提是CentOS系统已安装Python和pip。根据您的CUDA版本,从PyTorch官网获取合适的安装命令。对于仅需CPU的训练,可以使用以下命令:pipinstalltorchtorchvisiontorchaudio如需GPU支持,请确保已安装对应版本的CUDA和cuDNN,并使用相应的PyTorch版本进行安装。分布式环境配置:分布式训练通常需要多台机器或单机多GPU。所

See all articles