from collections import deque from functools import reduce from typing import Iterable import pytest def stick_last_two(source: Iterable): deck = deque() for item in source: deck.append(item) if len(deck) >= 3: yield deck.popleft() yield reduce(lambda a, b: a + b, deck) @pytest.mark.parametrize( 'inp, expected', [ ('1', ['1']), ('12', ['12']), ('123', ['1', '23']), ('1234', ['1', '2', '34']), ]) def test_stick_last_two(inp, expected): result = list(stick_last_two(inp)) assert result == expected if __name__ == '__main__': for corrected in stick_last_two('1'): print(corrected)