python - 在 Python 中何时使用生成器函数以及何时使用循环
问题描述
我来自 Matlab 背景,我发现很难绕过 Python 中生成器的概念。
有人可以回答我以下问题:
- 生成器函数和循环之间的区别
- 何时应实施
解决方案
生成器提供了一种“动态”创建元素的方法,而无需在我们开始遍历它们之前将它们全部保存在内存中。循环只是一种使生成器或另一个可迭代的方法,一次给我们一个元素。
例如:
for i in range(10):
print(i)
该for
块是一个循环,range
基本上是一个生成器。range
在循环开始之前不会list
从 1-10 创建一个,它只是创建生成器,即这些元素的创建者。您还可以想象range(1000000000000000000)
,它也不需要任何时间来创建(并且不会占用内存),因为在需要它们之前不会创建任何元素。
另一方面,我们的循环也可以从已经存在的对象中获取一个元素,例如list
:
for i in [0,1,2,3,4,5,6,7,8,9]:
print(i)
将打印相同的结果,但列表是在循环开始之前创建并存储在其条目中的。这意味着在循环运行时,列表会占用内存空间和时间来创建。
这两个示例都是循环,但只有第一个使用了生成器。
这只是基础,但还有更多区别,例如可以引发的异常和可重用性、部分迭代等等。
有关差异的更多信息
编辑:@Vicrobot 说这range
不是真正的生成器是正确的,但为了解释生成器的“懒惰”,这是我为简单起见而使用的
推荐阅读
- swift - 在 macOS 10.14 上键入文本时不出现 NSTextView 光标
- python - 美丽的汤刮桌
- php - PHP循环遍历数组内的数组
- python - 如何将一个图的输出作为输入传递给张量流中的另一个图
- java - Spring 在@Transactional 方法中捕获 JpaSystemException 并回滚事务
- hadoop - 从 hdfs 中删除文件是否会删除相应的 hive 外部表分区?
- django - DRF 序列化程序返回可为空的字段
- javascript - Highcharts 异步工具提示绘制在点的顶部
- html - 如何适合图像,以便我的图像旁边没有空格?
- java - 在 MVC 架构中模型应该是不可变的还是可变的?