我有一个迭代器,用于计算质数。我想创建一个生成器,以质数迭代器作为输入参数,计算循环的质数的平均值:
from itertools import islice, tee
def only_primes(stream):
try:
while True:
is_valid, value = next(stream)
while not is_valid:
is_valid, value = next(stream)
yield value
except StopIteration:
return
def is_prime(n):
if n < 2:
return False, n
elif n == 2:
return True, n
sqrt_n = int(n**0.5)+1
return len([i for i in range(2, sqrt_n+1) if n % i == 0]) == 0, n
prime_iterator = only_primes(map(is_prime, range(100)))
def prime_av(stream):
"""Generator that yields average value of looped prime numbers"""
n = 0
stats = dict()
stats['mean'] = 0
try:
while True:
prime = next(stream)
n += 1
stats['mean'] *= n - 1
stats['mean'] += prime
stats['mean'] /= n
yield stats
except StopIteration:
return
如果我同时循环遍历
raw
和prime_av(stats)
迭代器,只有最后一个平均值被打印出来。为什么?raw, stats = tee(prime_iterator)
list(islice(zip(raw, prime_av(stats)), 10))
输出:
[(2, {'mean': 12.9}),
(3, {'mean': 12.9}),
(5, {'mean': 12.9}),
(7, {'mean': 12.9}),
(11, {'mean': 12.9}),
(13, {'mean': 12.9}),
(17, {'mean': 12.9}),
(19, {'mean': 12.9}),
(23, {'mean': 12.9}),
(29, {'mean': 12.9})]