https://docs.python.org/3/tutorial/controlflow.html
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)
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]
# 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.
# 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")]
# 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')]
# 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]
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"))
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")