Lekcja 5 - pętle (notatki)

Lekcja 5 - pętle (notatki)

Pętle

W informatyce panuje zasada by wyeliminować powtórzenia w kodzie w myśl hasła "Don't repeat yourself" (w skrócie DRY). Temu służą pętle FOR i WHILE.

Pętle for tworzy się zgodnie ze wzorem: for element in ...: W następnej linijce po wcięciu podaje się to co ma nastąpić. W miejsce element wstawia się dowolną wartość, w miejsce wielokropka zmienną (pętla powtórzy się tyle razy ile jest przypisanych do zmiennej elementów) lub ilość powtórzeń jakie ma wykonać pętla.

PRZYKŁADY

moja_lista = [1,2,3,4,5]

for liczba in moja_lista:
  print(Hello!)

Jest 5 elementów w zmiennej moja_lista, więc napis Hello zostanie wydrukowany 5 razy.

moj_slownik = {"a":1, "b":2, "c":3}

for klucz in moj_slownik:
  print(klucz)

W przypadku gdy użyjemy w pętli słownika wydrukowane zostaną klucze.

for litera in "Robisz.to":
  print(litera)

Jeśli nakażemy wydrukowanie elementu z pętli (w tym wypadku liczba), wydrukuje każdy znak z następującego po in stringa "Robisz.to".

Gdy nie korzystamy z tej wartości wyciągniętej ze zmiennej to przyjęło się, że w miejsce elementu wstawiamy znak "podłogi" ("_").

W momencie gdy nie chcemy tworzyć sztucznej listy z 1o elementami by powtórzyła się pętla korzystamy z funkcji range.

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

Wydrukuje liczby od 0-9.

for _ in range(3):
  print("Hej")

Wydrukuje Hej! trzykrotnie.

Jeśli chcemy wydrukować konkretny zestaw liczb w nawiasie po funkcji range podajmy od jakiej liczby zaczynamy, przed jaką kończymy i co ile się przeskakuje wartości, zgodnie ze wzorem range(start,stop,krok).

for i in range(1,20,2):
  print(i)

Wydrukuje: 1 3 5 7 9 11 13 15 17 19

Gdy nie chcemy by drukowało wartości jeden pod drugim, lecz obok siebie rozdzielone spacją lub przecinkami korzysta się z end=" " / end=", ".

for i in range(5):
  print(i, end=" ")

ZADANIA

moja_lista = [2,3,4]
a=1
for i in moja_lista:
  a *= i 
print(a)

Wyświetli się 24, bo najpierw a ma wartość 1 i jest mnożone przez pierwszy element listy tj. 2, potem pętla się powtarza a zostało nadpisane więc ma wartość 2 i zostaje pomnożone przez drugie element listy czyli 3. Potem a, które ponownie zostało nadpisane (czyli ma wartość 6) zostaje pomnożone przez ostatni element listy czyli 4. Ostatecznie zatem a ma wartość 24.

moja_lista = [2,3,4]
for i in moja_lista:
  a = 1
  a *= i 
print(a)

Wyświetli się 4, ponieważ po przeniesieniu "a = 1" do wcięcia pod pętlą wartość a będzie z każdym razem nadpisywana wraz z kolejnym powtórzeniem pętli. Zatem w ostatnim powtórzeniu a będzie miało wartość 1 i zostanie przemnożona przez i, które będzie miało wartość 4. Dlatego ostateczny wynik to 4.

Gotowce

W bibliotece pythona znajduje się wiele "gotowców", które ułatwiają wykonanie wielu czynności, z których wiele wgranych jest już w podstawowej wersji pythona. Choć mogą ułatwić wykonanie wielu zadań należy korzystać z nich z umiarem i rozsądnie, ponieważ nie mając kontroli nad zawartym w nich kodem możemy narobić sobie problemów. Kiedy z nich korzystać? Gdy widzimy, że dane ułatwienie jest wielokrotnie ściągane, kiedy było niedawno aktualizowane a obejście się bez niego przysporzyłoby nam wielu linijek dodatkowego kodowania.

Aby zainstalować moduł, którego nie ma w naszej wersji pythona należy użyć terminalu i wpisać do niego: pip install nazwa_modulu. W momencie gdy chcemy skorzystać z już zainstalowanego modułu wystarczy na początku naszego pliku wpisać: import nazwa_modulu.

Moduł turtle

Jeden z bardziej znanych modułów to tzw. żółwik, który rysuje kształty na ekranie za pomocą kodu. Po wybraniu kształtu naszego "pędzla" czyli żółwika, ustawieniu jego szybkości ("zolwik.speed(...)") oraz opcjonalnie koloru linii ("zolwik.pencolor("...")") i jej grubości ("zolwik.pensize(...)") możemy przejść do kodowania jego ruchu.

import turtle

zolwik = turtle.Turtle()
zolwik.speed(5)
zolwik.shape("turtle")

# Tu wpiszemy kod

turtle.exitonclick()

Przykładowy kod. W miejsce # wpisujemy kod.

Można wykorzystać kilka komend do uruchomienia żółwia: naprzód (".forward(odległość)"), kółko (".circle(promień)"), skręć w prawo (".right(kąt skrętu)"), skręć w lewo (".left(kąt skrętu)") oraz unieś się (".penup()") by nie rysował linii i opadnij (".pendown()") - ponownie rysuje linie.

ĆWICZENIA

for _ in range(4):
    zolwik.forward(100)
    zolwik.right(90)

Gdy dodamy w miejsce linijki z # w powyższym przykładzie żółwik narysuje kwadracik.

W ten sposób można stworzyć każdy wielokąt foremny

ilosc_bokow = 8
for _ in range(ilosc_bokow):
    zolwik.forward(100)
    zolwik.right(360/ilosc_bokow)

Wzór na wielokąt foremny - zmieniasz tylko zmienną ilosc_bokow.

Lub wieloczęściową figurę np. rozetę:

ilosc_okreg = 8
for _ in range(ilosc_okreg):
    zolwik.circle(40)
    zolwik.left(360/ilosc_okreg)

Wzór na rozetę - zmieniasz tylko zmienną ilosc_okreg.

A także bardziej skomplikowane kształty:

for _in range(4):
  for a in range(2):
    zolwik.forward(100)
    zolwik.right(90)
  zolwik.forward(100)
  zolwik.left(90)

Żółwik narysuje krzyżyk.

ilosc_slupkow = 4
for i in range(ilosc_slupkow):
  for _ in range(2):
    zolwik.forward(80)
    zolwik.left(90)
    zolwik.forward(80*(i + 1))
    zolwik.left(90)
  zolwik.forward(80)

Żółwik narysuje schody

Pamiętajmy że możliwe są różne rozwiązania umożliwiające osiągnięcie tego samego efektu:

ilosc_slupkow = 4
szerokosc_podstawy = 60
for i in range(ilosc_slupkow):
  for _ in range(2):
    zolwik.forward(szerokosc_podstawy)
    zolwik.left(90)
    zolwik.forward(szerokosc_podstawy*(i + 1))
    zolwik.left(90)
  zolwik.forward(szerokosc_podstawy)

Żółwik narysuje schody

ZADANIE

Odtwórz poniższą figurę:

0:00
/0:11
import turtle

zolwik = turtle.Turtle()
zolwik.speed(5)
zolwik.shape("turtle")

rozmiar = 80
for _ in range(8):
    for _ in range(4):
        zolwik.forward(rozmiar)
        zolwik.left(90)
    rozmiar +=20


turtle.exitonclick()

Odtwórz poniższą figurę:

0:00
/0:16
import turtle

zolwik = turtle.Turtle()
zolwik.speed(5)
zolwik.shape("turtle")
zolwik.pencolor("green")
zolwik.pensize(3)

ilosc_kwadratow = 15
for _ in range(ilosc_kwadratow):
    for _ in range(4):
        zolwik.forward(100)
        zolwik.right(90)
    zolwik.left(360/ilosc_kwadratow)


turtle.exitonclick()

C.d. Modułu turtle w lekcji 6