Pętle w jednej linijce w Pythonie

Język Python posiada wiele sposobów na skrócenie zapisu kodu. Robi to zachowując jednocześnie czytelność całego kodu. Jednym z takich trików jest zapisywanie prostych pętli w jednej linijce. Podobny sposób pokazywałem już w artykule o Szybkiej edycji list. W tym poście pokażę jak tworzyć takie pętle.

Metody na zapisanie pętli w jednej linijce są dwie:

  • Pierwsza: Jeśli treść pętli składa się z jednego wyrażenia, należy zapisać to wyrażenie w tej samej linijce, po znaku dwukropka.

Przykład: for i in range(5): print(i). Wypisze na ekranie pierwsze 5 liczb naturalnych (czyli od 0 do 4).

  • Druga: Jeśli celem pętli jest stworzenie listy, użycie pętli tworzącej wewnątrz instrukcji listy.

Przykład: lista = [i for i in range(5)] stworzy listę zawierającą pierwszych 5 liczb całkowitych.

Troszkę więcej o metodzie pierwszej

Powiedzmy, że chcielibyśmy zapisać poniższą instrukcję w jednej linijce:

1
2
for i in range(10):
    print(i)

Nie ma najmniejszego problemu! Możemy użyć zapisu

1
for i in range(10): print(i)

Efekt będzie dokładnie taki sam, a my zaoszczędzimy jedną linijkę.

Pytaniem z innej beczki jest natomiast to, czy można w jednej linijce zapisywać bardziej złożone wyrażenia i instrukcje. Odpowiedź jest oczywista i brzmi: Tak! Jest to jednak trudniejsze i wymaga od piszącego więcej skupienia, ale “coś za coś”.

Załóżmy, że chcemy zapisać poniższą instrukcję w jednej linijce:

1
2
3
4
5
6
for i in range(5):
    if i < 4:
        j = i**2
    else:
        j = 0
    print(j)

Skrypt wypisze następujące liczby:

1
2
3
4
5
0
1
4
9
0

A jakby wyglądał ten skrypt w jednej linijce? Na przykład tak:

1
for i in range(5): print(i**2 if i < 4 else 0)

A teraz szerzej o Metodzie 2

Młodzi i nowi w języku jej nienawidzą, a doświadczeni nie mogą bez niej żyć. Metoda szybkiego, jednolinijkowego tworzenia list to coś co warto się nauczyć.

Powiedzmy, że chcemy stworzyć listę zawierającą pięć pierwszych kwadratów liczb naturalnych. Typowy kod może wyglądać np. tak:

1
2
3
4
5
6
potegi = []

for i in range(5)
    potegi.append(i ** 2)

print(potegi)

Otrzymany wynik powinien wyglądać mniej-więcej tak jak ten:

1
2
3
4
5
0
1
2
9
16

Wstawiając pętlę do instrukcji listy będziemy w stanie skrócić cały ten zapis do dwóch linijek, a samo tworzenie listy do jednej linijki:

1
2
potegi = [i ** 2 for i in range(5)]
print(potegi)

Dostaniemy ten sam rezultat, oszczędzając jednocześnie kilka linijek skryptu. Jak tu nie skorzystać?

Mały bonus

Zastanów się jaki będzie efekt działania poniższego kodu, a potem wypróbuj go w interpreterze Pythona. Ile linijek zaoszczędzisz zapisując skrypty w taki sposób?

1
print([i ** 2 for i in range(10) if i % 2 == 0])