Я хотел бы связать итераторы / генераторы, а затем бесконечно циклически повторять их. В основном у меня есть x количество пар широты и долготы. Я хочу интерполировать между парами и дать текущую точку шага. Я собрал следующий код, но боюсь, что мои ограниченные знания итераторов / генераторов подвели меня, и я получаю ошибку TypeError: 'PointsIterator' object is not iterable
. Я не уверен, почему.
interpolate
- это неитераторная наивная широта и долгота. Я также не знаю, как получить не-генераторную форму print(next(PointsIterator((4, 2), (-4, 5), 3)))
, поскольку она возвращает <generator object PointsIterator.__next__ at 0x000001FEA5BA5930>
вместо (4.0, 2.0)
.
Также, как мне обработать исключение StopIteration
или будет chain
и cycle
делают это автоматически?
from itertools import chain, cycle
def interpolate(start, end, steps):
points = []
lat_step = (end[0] - start[0]) / (steps + 1)
lon_step = (end[1] - start[1]) / (steps + 1)
for i in range(1, steps + 2):
points.append((lat_step * i + start[0] - lat_step, lon_step * i + start[1] - lon_step))
return points
points = interpolate((4, 2), (-4, 5), 9)
#for p in points:
# print(p)
class PointsIterator(object):
def __init__(self, start, end, steps):
self.points = []
self.position = 0
lat_step = (end[0] - start[0]) / (steps + 1)
lon_step = (end[1] - start[1]) / (steps + 1)
for i in range(1, steps + 2):
self.points.append((lat_step * i + start[0] - lat_step, lon_step * i + start[1] - lon_step))
self.max_position = len(self.points)
def __next__(self):
if self.position >= self.max_position:
raise StopIteration
result = self.points[self.position]
self.position += 1
yield result
my_iter = chain(PointsIterator((4, 2), (-4, 5), 3), PointsIterator((-4, 5), (1, 1), 3), PointsIterator((1, 1), (4, 2), 3))
g = cycle(my_iter)
print(next(g))