Pętla for

https://docs.python.org/3/tutorial/controlflow.html

WPROWADZENIE

Pętla for jest uniwersalnym iteratorem po sekwencjach lub innych obiektach iterowalnych. Jeżeli chcemy wykonać pętlę po ciągu liczb całkowitych, to pomocna jest funkcja range() (Py3) lub wersja z generatorem xrange() (Py2). Można stosować break (natychmiastowe wyjście z pętli) i continue (kontynuacja pętli) jak w języku C.

Niebezpiecznie jest modyfikować sekwencję (np. listę) po której biegnie pętla for. Należy raczej zrobić kopię listy do iteracji. Bezpieczną operacją jest wydłużenie listy przez L.append(item) lub L.extend(sequence).


# Składnia.
for item in sequence:   # wiersz nagłówkowy
    instrukcje      # tu zwykle używamy item
    if test1:
        break       # wyjście z pętli, opcjonalne
    if test2:
        continue    # przejście na górę pętli, opcjonalne
    instrukcje
else:               # opcjonalne
    instrukcje      # jeżeli nie było break, działa nawet przy pustej sekwencji

word = "praca"
for char in word:             # pętla po stringu
    #print char,               # przecinek daje wydruk w jednym wierszu (Py2)
    print(char, end=" ")      # wydruk w jednym wierszu (Py3)
print("")                    # na koniec przechodzimy do nowej linii

# Pętla po liczbach z funkcji range().
for i in range(6):            # liczby od 0 do 5
    print(i)
# Indeks pętli żyje poza nią.
print(i)                   # wynik to 5

# Pętla po liście składającej się z elementów różnych typów.
for item in [4, "s", [2, 3], 3.14159]:
    print(item)

# Pętla po krotce różnych elementów.
for item in (6, "abc", 1.2):
    print(item)

# Pętla po liście składającej się z krotek.
# Następuje pozycyjne przypisanie zmiennych.
for (a, b) in [(2, "i"), (3.14, "f"), ("a", "s")]:
    print("{} {} {} {}".format("pierwszy", a, "drugi", b))

# Wydłużanie listy w trakcie działania pętli for.
# Zachować ostrożność!
# Można wpaść w pętlę nieskończoną.
L = list(range(5))
for i in L:
    print(i)
    if (i % 2) == 1:            # jeżeli i jest nieparzyste
        L.append(2 * i)         # dodaję tylko parzyste
        L.append(4 * i)         # dodaję tylko parzyste
        #L.extend((2 * i, 4 * i))
# Wynik: 0 1 2 3 4 2 4 6 12

# Bezpieczniejszy wariant z kopią listy.
for item in L[:]:   # albo list(L)
    process(item)

# Pętla for w konteście słowników.
D = {"a": 1, "b": 2, "c": 3}
for key in D:                 # pętla po kluczach
    print("{} {}".format(key, D[key]))
for (key, value) in D.items():
    print("{} {}".format(key, value))

# Pętla po sekwencji w kolejności odwrotnej.

for char in reversed("qwerty"):   # 'reversed object'
    print(char)   # y, t, r, e, w, q

# Pętla po sekwencji posortowanej w locie.

for char in sorted("qwerty"):   # ['e', 'q', 'r', 't', 'w', 'y']
    print(char)

# Pętla po sekwencji bez duplikatów.

for char in set("abracadabra"):   # 'a', 'c', 'd', 'b', 'r'
    print(char)

GENEROWANIE WARTOŚCI PRZESUNIĘCIA I ELEMENTÓW


fruits = ["apple", "pear", "plum"]

# Pętla for po liście stringów.
for fruit in fruits:
    print("Bardzo lubię {}!".format(fruit))

# Pętla po liście stringów z wykorzystaniem indeksów.
# Tak można robić, gdy potrzebujemy wykorzystać numer elementu.
for i in range(len(fruits)):
    print("{} {}".format(i, fruits[i]))

# Obecnie wygodniej jest zastosować funkcję enumerate().
# enumerate(iterable, start=0) - zwraca 'enumerate object' (iterator).
for (i, item) in enumerate(fruits):
    print("{} {}".format(i, item))

list(enumerate(fruits, start=1))   # [(1, 'apple'), (2, 'pear'), (3, 'plum')]
[c*i for (i, c) in enumerate("abcd")]   # ["", "b", "cc", "ddd"]
[2**i for i in range(5)]                # [1, 2, 4, 8, 16]

ZAGNIEŻDŻONE PĘTLE FOR


# Wyszukiwanie wspólnych elementów dwóch sekwencji.
seq1 = "mielonka"
seq2 = "biedronka"
alist = []
for item in seq1:
    if item in seq2:   # mało wydajne
        alist.append(item)
print(alist)               # ["i","e","o","n","k","a"]
# Inny sposób polega na zastosowaniu zbiorów.

LISTY SKŁADANE


# Oczyszczanie linii z białych znaków po prawej stronie.
# lines to lista stringów.
lines = [line.rstrip() for line in lines]

lines = [line.rstrip() for line in open("words.txt")]
lines = [line.upper() for line in open("words.txt")]
lines = [line.replace("\t", ";") for line in open("words.txt")]

PRZECHODZENIE RÓWNOLEGŁE - ZIP


# Składnia Py2.
# zip(seq1 [, seq2 [...]]) zwraca listę krotek [(seq1[0], seq2[0] ...), (...)].
# Lista ma długość najkrótszej sekwencji.
# W Py3 zip() zwraca 'zip object' (iterator).

L = [1, 2, 3, 4]
M = [5, 6, 7, 8]
for (x, y) in zip(L, M):
    print("{} {} {}".format(x, y, x+y))
for (x, y) in zip("abcdef", "qwerty"):
    print("{} {} {}".format(x, y, x+y))
list(zip("ab", "1234"))   # [('a', '1'), ('b', '2')]

PRZECHODZENIE RÓWNOLEGŁE - MAP


# Składnia Py2.
# map(function, sequence[, sequence, ...]) zwraca listę.
# W Py3 map() zwraca 'map object' (iterator).

# Funkcję map można łatwo zastąpić listą składaną.
L = [-2, -1, 0, 1, 2]
list(map(abs, L))   # [2, 1, 0, 1, 2]
[abs(x) for x in L]

list(map(ord, "qwerty"))   # [113, 119, 101, 114, 116, 121]
[ord(x) for x in "qwerty"]

L = [1, 2, 3, 4]
M = [1, 1, 2, 2]
list(map(pow, L, M))   # [1, 2, 9, 16]
[pow(x, y) for (x, y) in zip(L, M)]

words = ["jeden", "dwa", "trzy"]
list(map(str.upper, words))   # ['JEDEN', 'DWA', 'TRZY']
[word.upper() for word in words]

TWORZENIE SŁOWNIKÓW ZA POMOCĄ FUNKCJI ZIP


keys = ["jeden", "dwa", "trzy"]
values = ["I", "II", "III"]
D = dict(zip(keys, values))
# To samo za pomocą pętli for.
D = {}              # lub D = dict()
for (k, v) in zip(keys, values):
    D[k] = v

D = dict(zip(range(6), "qwerty"))

INNE KONTEKSTY ITERACYJNE

Funkcje wbudowane: sorted(), sum(), min(), max(), any(), all(), list(), tuple(), set(), str.join(), zip().

Nowe obiekty iterowane w Pythonie 3: dict.keys(), dict.values(), dict.items(), range(), map(), zip(), filter().


# Zastosowanie funkcji all() i any().

L = [1, 2, 4, 5]
#L = [2, 4, 6]

# Sprawdzamy, czy wszystkie liczby są parzyste.

# Zastosowanie klauzuli else w pętli for.

for x in L:
    if x % 2 != 0:
        break
else:
    print("wszystkie parzyste")

# Zastosowanie all().

if all(x % 2 == 0 for x in L):
    print("wszystkie parzyste")

# Sprawdzamy, czy choć jedna liczba jest parzysta.

if any(x % 2 == 0 for x in L):
    print("jest liczba parzysta na liście")