Lekcje modułu (1/4)
Pętle for i range
Pętla for w Pythonie służy do iteracji po sekwencji elementów:
liście, ciągu znaków, przedziale (range), słowniku… wszystkim, co jest "iteralne".
parole = ["ciao", "mondo", "!"]
for p in parole:
print(p)
# ciao
# mondo
# !Wzór jest zawsze taki sam: for <variable> in <iterable>: a po nim wcięty
blok, który zostanie wykonany raz dla każdego elementu.
range(...): generowanie przedziałów liczb całkowitych
range tworzy leniwą (lazy) sekwencję liczb całkowitych. Trzy formy:
range(5) # 0, 1, 2, 3, 4
range(2, 6) # 2, 3, 4, 5
range(0, 10, 2) # 0, 2, 4, 6, 8 (step)
range(5, 0, -1) # 5, 4, 3, 2, 1 (negative step)range jest prawostronnie wykluczający, podobnie jak slice. Jest to obiekt leniwy:
nie alokuje pamięci dla wszystkich liczb, lecz generuje je po kolei.
totale = 0
for i in range(1, 11):
totale = totale + i
totale # 55 (1+2+...+10)Iteracja z indeksem: enumerate
Gdy potrzebujesz elementu i jego indeksu razem, użyj enumerate:
parole = ["ciao", "mondo", "!"]
for i, p in enumerate(parole):
print(i, p)
# 0 ciao
# 1 mondo
# 2 !enumerate generuje pary (index, value), które przypisujemy bezpośrednio do dwóch
zmiennych poprzez rozpakowywanie krotek.
Iterowanie po dwóch sekwencjach równolegle: zip
nomi = ["Ada", "Linus", "Grace"]
anni = [36, 54, 79]
for n, a in zip(nomi, anni):
print(f"{n} ha {a} anni")zip zatrzymuje się na najkrótszej sekwencji.
range() i lenistwo Pythona
W Pythonie funkcja range() nie alokuje rzeczywistej listy w pamięci: zwraca leniwy generator (lazy generator), który dostarcza liczby pojedynczo na żądanie (na przykład w pętli for). Pozwala to na iterację po milionach liczb całkowitych bez zapełniania pamięci RAM. Aby podejrzeć wartości range jako listę, możesz ją jawnie przekonwertować za pomocą list(range(5)).
Spróbuj sam
Oblicz sumę liczb od 1 do 100 (włącznie) za pomocą pętli for po range(...), przypisz sumę do zmiennej `total` i oceń.
Pokaż wskazówkę
range(1, 101) generuje 1, 2, ..., 100 (wykluczając prawą stronę).
Rozwiązanie dostępne po 3 próbach
Ćwiczenie powtórzeniowe
Mając daną listę `words = ['uno', 'due', 'tre']`, utwórz listę `pairs` ciągów znaków takich jak '0:uno', '1:due', '2:tre' przy użyciu enumerate. Oceń `pairs`.
Pokaż wskazówkę
enumerate(words) zwraca (index, value) przy każdej iteracji.
Rozwiązanie dostępne po 3 próbach
Dodatkowe wyzwanie
Oblicz sumę wszystkich liczb parzystych od 2 do 20 włącznie, używając pętli `for` po `range`. Zapisz ostateczną sumę w zmiennej `even_sum` i oceń ją.
Pokaż wskazówkę
Użyj range(2, 21, 2), aby iterować tylko po parzystych liczbach całkowitych od 2 do 20.
Rozwiązanie dostępne po 3 próbach