def merge(iter1, iter2, key=None):
    if key is None:
        key = lambda x: x
wrap1 = NextValueWrapper(iter1)
wrap2 = NextValueWrapper(iter2)
while not (wrap1.finished and wrap2.finished):
    if wrap2.finished or not wrap1.finished and key(wrap1.next_value) <= key(
        wrap2.next_value):
        yield wrap1.get()
else:
    yield wrap2.get()
Объединить два отсортированных итератора без замены