我有素数生成器。产生的项目将强制转换为列表。我可以引用列表中的任何项目。
def primes(limit):
yield 2
if limit < 3:
return
lmtbf = (limit - 3) // 2
buf = [True] * (lmtbf + 1)
for i in range((int(limit ** 0.5) - 3) // 2 + 1):
if buf[i]:
p = i + i + 3
s = p * (i + 1) + i
buf[s::p] = [False] * ((lmtbf - s) // p + 1)
for i in range(lmtbf + 1):
if buf[i]:
yield i + i + 3
x = list(primes(100))
print(x)
print(len(x), '\n')
输出:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
25
问题是,如果我使用x = list(primes(num))并使用非常大的数字,则结果列表将变为很大。
我想要的是列表中的最后n个(最大)项目,但我可以更改n个。
我以为deque()会是完美的选择。我查看了文档,发现:附加到已满的双端队列(len(d)== d.maxlen)会从另一端丢弃项目。
这加上我在队列创建时指定maxlen = n的功能,正是我想要的。
考虑到这一点,我尝试了这个:
from collections import deque
def primes(limit):
yield 2
if limit < 3:
return
lmtbf = (limit - 3) // 2
buf = [True] * (lmtbf + 1)
for i in range((int(limit ** 0.5) - 3) // 2 + 1):
if buf[i]:
p = i + i + 3
s = p * (i + 1) + i
buf[s::p] = [False] * ((lmtbf - s) // p + 1)
for i in range(lmtbf + 1):
if buf[i]:
yield i + i + 3
x = deque([primes(100)], maxlen=10)
# x = list(primes(100))
print(x)
print(len(x), '\n')
但是我得到的是:
deque([<generator object primes at 0x0000025ED8449C80>], maxlen=10)
1
我也尝试过:
for i in x:
print(x)
但是那也不起作用。
我如何如上所述使用deque()获得所需的结果?
我需要能够打印出双端队列的内容,它应该是生成器中的最后n个项目。
计算出来:x = deque([x表示x以质数(100)表示,maxlen = 10)
deque([53,59,61,67,71,73,79,83,89,97],maxlen = 10)10
x = deque([x表示素数(1000)中的x,maxlen = 10)
deque([937,941,947,953,967,971,977,983,991,997],maxlen = 10)10