# -*- coding: UTF-8 -*-
def _odd_iter():
n = 1
while True:
n = n + 2
yield n
def _not_divisible(n):
return lambda x: x % n > 0
def primes():
yield 2
it = _odd_iter() # 初始序列
while True:
n = next(it) # 返回序列的第一个数
yield n
it = filter(_not_divisible(n), it) # 构造新序列
# 打印1000以内的素数:
for n in primes():
if n < 1000:
print(n)
else:
break
我在学习python的时候遇到上面这么一段代码,可是令我不明白的是, it = filter(_not_divisible(n), it) 为什么代码中的这一行,在每次循环的过程中,构建这么一个新的迭代器,却不需要计算出所有可能的结果
对于我来说最大的疑惑是, it = filter(_not_divisible(n), it) 这里每一次循环都会变为一个新的迭代器,这个迭代器如何保证符合前面迭代器的条件呢
就好比你只是数数的话,那么只是费时间
除非你把数写下来,才会用光纸张。
按顺序执行,新的迭代器会覆盖旧的迭代器,或者说产生新的 旧的就被释放了..
迭代器比较重要的特点就是:惰性计算,延迟执行,按需加载。
你这里说的无穷迭代器,并不会提前将所有数据生成,而是每次 for n in primes()
循环调用 primes()
和 执行 next(it)
时,才会按需生成一个值。而在下次生成值的时候,有会覆盖上次的值。所以内存占用是固定的,而且非常的小。
【以下回答由 GPT 生成】
这段代码使用了一个无穷迭代器来处理过滤操作。对于无穷迭代器,它不会一次性地生成所有结果,而是在需要的时候计算,并且只计算当前所需的结果。因此,即使是在每次循环中构建一个新的迭代器,也不会占用过多的内存。
具体来说,这段代码中的filter
函数接受一个函数和一个迭代器作为参数,返回一个新的迭代器,该迭代器包含满足函数条件的元素。在每次循环中,filter
函数会调用传递给它的函数,检查当前元素是否满足条件。
对于这个例子中的filter(_not_divisible(n), it)
,_not_divisible(n)
是一个函数,用于检查迭代器it
中的元素是否不能被n
整除。在每次循环中,filter
函数会使用_not_divisible(n)
函数来过滤掉不符合条件的元素,并返回一个新的迭代器。这个新的迭代器只包含满足条件的元素,这样就避免了生成所有可能的结果。
因为无穷迭代器只计算当前所需的结果,并且不会一次性地生成全部结果,所以它的内存占用量非常小。此外,Python解释器还会对内存进行优化,可以及时回收不再使用的内存资源,进一步减少内存的占用。
总结起来,这段代码中的无穷迭代器只在需要的时候计算当前所需的结果,不会一次性生成全部结果,因此不会占用过多的内存。
【相关推荐】