We wpisie Kiedy przydaje się generator, został poruszony temat związany z wyodrębnianiem działań z pętli, który chciałbym tutaj rozszerzyć o kolejny przykład.
Spórzmy na poniższy fragment kodu:
for i in range(len(numbers) - 1):
print(numbers[i], numbers[i+1])
Pętla skupia się na wyświetleniu elementów z przykładowej listy [1, 2, 3, 4, 5] w sposób następujący:
1 2
2 3
3 4
4 5Tutaj można przygotować generator, który wyodrębni część związaną z indeksami.
def pairwise(xs):
for i in range(len(xs) - 1):
yield xs[i], xs[i+1]
Zapis tego generatora będzie tak wyglądać:
for a, b in pairwise(numbers):
print(a, b)
Ta pętla jest nie tylko krótsza, ale również, co warte podkreślenia, ukrywa pracę z indeksami. Dzięki temu zabiegowi kod tej pętli staje się czytelniejszy, ponieważ nieistotne szczegóły zostają zepchnięte na dalszy plan.
Podsumowując, gdyby pairwise był funkcją, wtedy jej zastosowanie nie byłoby zasadne, ponieważ z każdym jej użyciem, tuż przed wykonaniem pętli, funkcja musiałaby wykonać się w całości.