for (i, k) in zip(l[::2], l[1::2]):
print i, "+", k, "=", i+k
zip(*iterable)
возвращает кортеж со следующим элементом каждого итерабельного.
l[::2]
возвращает элемент 1-го, 3-го, 5-го и т. д. списка: первая двоеточие указывает, что срез начинается с начала, потому что за ним нет номера, второй двоеточие требуется только, если вы хотите «шаг в срезе» (в этом случае 2).
l[1::2]
делает то же самое, но начинается во втором элементе списков, поэтому он возвращает элемент 2-го, 4-го, 6-го и т. д. исходного списка.