1.7. Pętla FOR

Prezentacja

Python wymaga, aby w instrukcji for, po określeniu warunku następowało wcięcie kolejnej linijki kodu. Nie ma ściśle określonej liczby spacji, ani tabulatorów, ale ważne jest to, żeby wewnątrz danej instrukcji być konsekwentnym – jeśli raz użyjemy jako wcięcia czterech spacji, to kolejna linijka też tyle musi mieć – inaczej Python zwróci błąd indentencji.

Składnia

Składnia pętli for jest prosta do opanowania:

1
2
3
4
for cel in obiekt :
    instrukcja1
else:
    instrukcja2

W pętli for do zmiennej cel po kolei przypisywane są elementy zawarte w zmiennej obiekt.

Instrukcja else, która jest całkowicie opcjonalna, zostanie wykonana, gdy podczas wykonywania pętli nie natkniemy się na break.

Zadania

Zadanie 1. Napisz program drukujący podaną liczbę x (np. ośmiocyfrową) w odwrotnej kolejności

Zadanie 2. Napisz program, który wypisze piętnaście pierwszych wielokrotności liczby 3.

Zadanie 3. Napisz program, który wpisze wszystkie dzielniki naturalne podanej liczby n.

Zadanie 4. Napisz program rysujący prostokąt z gwiazdek o wymiarach n x m.

Rozwiązania

Zadanie 1. Zadanie można rozwiązać na dwa sposoby. Jeden z nich jest dość sprytny i w ogóle nie wymaga użycia pętli for. Wystarczy przekonwertować liczbę x na stringa, zrobić z niego palindrom (za pomocą indeksów) i przekształcić ponownie na liczbę całkowitą. Całość może zawrzeć się w dwóch linijkach:

1
2
x = 2313213123
print(int(str(x)[::-1]))

Inny sposób – bardziej siłowy będzie polegał na wykorzystaniu pętli i ręcznym tworzeniu palindromu. W tym celu tworzymy nową zmienną string_x, która jest zmienną x przekształconą na stringa. Tworzymy też pomocniczą zmienną x_new, do której pętla for będzie dodawała kolejne znaki odwracanej liczby.

Pętla będzie wybierała po kolei znaki zmiennej string_x, idąc od końca i wstawiając je jako kolejne litery w zmiennej x_new. Po ukończeniu pracy pętli x_new będzie zawierała wszystko to co jest w string_x, ale w odwróconej kolejności.

1
2
3
4
5
6
7
8
x = 2312300
string_x = str(x)
x_new = ""

for i in range(len(string_x)):
    x_new += string_x[len(string_x) - i - 1]

print(int(x_new))

Zadanie 2. Do wykonania programu potrzeba tylko dwóch linijek kodu. Pierwsza będzie zawierała instrukcję pętli, gdzie zadeklarujemy, że pętla for ma działać przez 15 przejść (używamy do tego funkcji range(15)). Druga i ostania linijka to funkcja drukowania print(), która mnoży aktualną wartość iterowanej zmiennej i przez 3.

1
2
for i in range(15):
    print(3 * i)

Zadanie 3. Liczba całkowita jest dzielnikiem liczby n, gdy reszta z dzielenia n przez i będzie równa zero, czyli n % i == 0. Nasza pętla musi sprawdzić zatem każdą liczbę od 1 do n i jeśli wykryje dzielnik – to ma go wypisać na ekran. Będziemy musieli zatem połączyć pętlę z instrukcją warunkową if. Jedna z możliwych realizacji tego skryptu widoczna jest poniżej:

1
2
3
4
5
n = 24

for i in range(1,n + 1):
    if n % i == 0:
        print(i)

Zaznaczę, że nie jest to najlepsza realizacja skryptu. Da się go znacznie przyspieszyć, jeśli zauważy się fakt, że zawsze gdy liczba a jest dzielnikiem liczby n, to mamy automatycznie również drugi dzielnik – liczbę n / i. Inaczej mówiąc – w cenie jednego mamy dwa dzielniki. Teraz tylko trzeba wpaść na to jak długo powinna trwać pętla…

Zadanie 4. Skrypt zaczynamy z dwiema zmiennymi: n oraz m, mówiącymi o wymiarach prostokąta, który będziemy musieli stworzyć. Do wykonania programu wystarczy jedna pętla, która wykona n przejść. W czasie każdego przejścia wydrukujemy na ekran rząd m gwiazdek, używając do tego jednej instrukcji print().

1
2
3
4
5
n = 8
m = 3

for i in range(n):
    print(m * '*')