如何最简单、通俗地理解Python的迭代器?

embedded/2024/11/24 11:46:41/

我们知道迭代器(iterator)可以用for循环去取数,这和列表取数有什么区别呢?

想理解Python迭起器的差异,有个很简单的例子

打个比方,你去玩街头投篮机,可以投5个球,这里有两种方式:

一种是给你5个球,挨个去投,每个球投完都会留在机器里,而且你可以任选投投球顺序

另一种方式是只给你一个球,投完球会自动滚出来,投完5次后就结束

这两种方式都能让你投完5个球

第一种方式类似列表

列表里的元素是实实在在存在于内存的,就像第一种投篮方式的5个球,摆在那让你投

第二种方式类似迭代器

迭代器里的元素其实是数据流,只有当你使用next()调用它的时候,它才会出来。

这里和第二种投篮方式方式思路接近,只有你发生了投篮行为next(),才会开始下一次投篮。

说到这里,可能你开始有些懂了,但还比较抽象,下面我们看下具体的代码。

# 用列表装5个篮球
this_is_basketball = [1,2,3,4,5]
# 投球
for player in this_is_basketball:print('投球:',player)

# 用迭代器装5个篮球
this_is_basketball = (x for x in range(1,6))
# 投球
for player in this_is_basketball:print('投球:',player)

可以看出来迭代器并不真正的把所有篮球都放出来,而是存储了生成元素的逻辑,你每次取的时候,篮球就会挨个被取出来。而列表是把篮球都装进来,for循环挨个投。

用迭代器的好处是你可以投1万次、10万次甚至无数次球,而列表能装的容量总是局限的。

所以说迭代器是一个惰性的数据流。

可迭代对象(Iterable)和迭代器(Iterator)的区别

前面我们说的列表、迭代器都是可迭代对象,就是能够被循环取数的对象

from collections.abc import Iterable
isinstance([], Iterable)
# 返回 True,说明列表是可迭代对象

元组、字典、字符串等也都是可迭代对象。

注意,可迭代对象不可以用next()函数挨个去访问元素

但是迭代器是可以用next()函数挨个去访问元素

可迭代对象可以通过iter函数变成迭代器

from collections.abc import Iterator
isinstance([], Iterator)
# 返回False,说明列表不是迭代器
isinstance(iter([]), Iterator)
# 返回 True,iter函数可以让列表变成迭代器

生成器(generator)和迭代器(Iterator)的区别

你可能看过下面的代码,生成器推导式用于生成序列

this_is_basketball = (x for x in range(1,6))

或者使用yield来生成序列

def generator_(m):n=0for i in range(m):if n < m:n += 1yield nelse:break

这里都是生成器,使用逻辑来表示序列,而很少占用内存

生成器都是特殊的迭代器,可以使用next来取值


http://www.ppmy.cn/embedded/140119.html

相关文章

Apache Calcite - calcite jdbc驱动使用场景

前言 在使用Calcite查询数据时通常会用到这些代码获取schema Connection connection DriverManager.getConnection("jdbc:calcite:", info); CalciteConnection calciteConnection connection.unwrap(CalciteConnection.class); SchemaPlus rootSchema calciteC…

状态压缩DP 树形DP 以及记忆化搜索

状态压缩DP 题目一 解题思路 原题解链接&#xff1a;https://www.acwing.com/solution/content/15616/ 补充&#xff1a; 解释一下st[j | k] &#xff1a;已经知道st[]数组表示的是这一列没有连续奇数个0的情况&#xff0c;我们要考虑的是第i-1列&#xff08;第i-1列是这里的…

使用 Java 中的 `String.format` 方法格式化字符串

前言 在编程过程中&#xff0c;我们经常需要创建格式化的字符串来满足特定的需求&#xff0c;比如生成用户友好的消息、构建报告或是输出调试信息。Java 提供了一个强大的工具——String.format 方法&#xff0c;它可以帮助我们轻松地完成这些任务。 String.format 方法简介 …

Android 网络请求(一)初识HTTP网络通信

学习笔记 代码样例 import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL;public class HttpURLConnectionExample {public String getDataFromServer() {String result ""; // 存储请求返…

MAC借助终端上传jar包到云服务器

前提&#xff1a;保证工程本地已打包完成&#xff1a;图中路径即为项目的target目录下已准备好的jar包 第一步&#xff1a;打开终端&#xff08;先不要连接自己的服务器&#xff09;&#xff0c;输入下面的上传命令&#xff1a; scp /path/to/local/app.jar username192.168.1…

node节点无法加入集群

node02节点在加入集群时提示 [preflight] Running pre-flight checkserror execution phase preflight: couldnt validate the identity of the API Server: failed to request the cluster-info ConfigMap: client rate limiter Wait returned an error: rate: Wait(n1) would…

什么是JavaScript原型链?

原型链&#xff08;Prototype Chain&#xff09;是JavaScript中面向对象编程的一个核心概念&#xff0c;它定义了对象之间的层次关系和属性查找机制。在JavaScript中&#xff0c;每个对象都有一个[[Prototype]]属性&#xff08;内部属性&#xff09;&#xff0c;这个属性指向其…

java excel 导入各种踩坑

在 Java 中处理 Excel 导入时&#xff0c;常见的问题&#xff08;即“踩坑”&#xff09;很多&#xff0c;下面列举了处理 Excel 导入时可能遇到的一些问题&#xff0c;并给出了解决方案和优化技巧。 1. POI 库与版本问题 Apache POI 是处理 Excel 的常用库&#xff0c;但是不…