Professional Documents
Culture Documents
Kinga Węzka
kinga.wezka@pw.edu.pl
Katedra Geodezji i Astronomii Geodezyjnej
Plan
1. Sterowanie wykonywaniem programu
Pętle w Pythonie
2. Pętla for
Obiekty iterowalne (iteratory)
3. Przykłady użycia pętli for
Przykłady użycia pętli for - iteracja po łańcuchu znaków
Przykłady użycia pętli for - iteracja po listach
Przykłady użycia pętli for - iteracja po słownikach
Przykłady użycia pętli for - zip - przechodzenie równoległe
Przykłady użycia pętli for - enumerate - generowanie wartości przesunięcia i elementów
4. Wynik wykonania pętli for – zasięg wyniku działania pętli
5. Pętle zagnieżdżone (ang. nested loops)
6. Listy i Słowniki składane (ang. list and dict comprehension)
7. Wyrażenie else dla pętli for
8. Instrukcje kontrolne w pętli for
9. Podsumowanie: funkcje często używane z iteratorami
Wyk. 5: Informatyka Geodezyjna - pętla for 2/36
Sterowanie wykonywaniem programu
Obie pętle są używane w celu przetwarzania powtarzającej się sekcji kodu. W przeciwieństwie
do pętli for pętla while nie jest uruchamiana n-razy, ale dopóki zdefiniowany warunek nie
będzie już spełniony. Jeśli warunek jest na początku (w pierwszym przejściu) fałszywy, blok
kodu w pętli nie zostanie w ogóle wykonany.
Pętla for "przebiega" przez podany zbiór danych, który jest obiektem iterowalnym lub
iteratorem (np. łańcuch znaków, lista, słownik itp.) oraz własnych typach obiektów, które
można tworzyć za pomocą klas (więcej na wykładach na temat programowanie obiektowe)
for
1 for <element> in <obiekt iterowalny>:
2 blok kodu: wykonanie dla elementu
koniec elementów
element w sekwencji
zbioru wyjście z pętli
danych
blok kodu
Pętla for "przebiega" przez podany zbiór danych, który jest obiektem iterowalnym lub
iteratorem (np. łańcuch znaków, lista, słownik itp.) oraz własnych typach obiektów, które
można tworzyć za pomocą klas (więcej na wykładach na temat programowanie obiektowe)
for
1 for <element> in <obiekt iterowalny>:
2 blok kodu: wykonanie dla elementu
koniec elementów
In[2]:
element w sekwencji
1 for element in [1, 2, 3]:
zbioru wyjście z pętli 2 wynik = element + 5
danych 3 print(wynik)
blok kodu
Pętla for "przebiega" przez podany zbiór danych, który jest obiektem iterowalnym lub
iteratorem (np. łańcuch znaków, lista, słownik itp.) oraz własnych typach obiektów, które
można tworzyć za pomocą klas (więcej na wykładach na temat programowanie obiektowe)
for
1 for <element> in <obiekt iterowalny>:
2 blok kodu: wykonanie dla elementu
koniec elementów
In[3]:
element w sekwencji
1 for element in [1, 2, 3]:
zbioru wyjście z pętli 2 wynik = element + 5
danych 3 print(wynik)
Out[3]: 1 6
2 7
blok kodu 3 8
Kiedy mamy kolekcję typów danych, to naturalne jest, że chcemy przeprowadzać iteracje
przechowywanych tam danych.
Typ danych umożliwiający iterację to taki, który może zwrócić pojedynczo każdy jego
element. Każdy obiekt posiadający metodę __iter__() lub każda sekwencja (na
przykład obiekt posiadający metodę __getitem__() pobierająca argumenty w postaci
liczb całkowitych, począwszy od zera) pozwala na iterację i jest iteratorem
(Summerfield, 2010, p.155).
Kiedy używamy pętli for element in iterator, Python w rzeczywistości wywołuje
funkcję iter(iteracja) w celu pobrania iteratora. Następnie w trakcie wykonywania
każdej pętli iteracji zostaje wywołana metoda iteratora – __next__() , której celem jest
pobranie kolejnego elementu. Po zgłoszeniu wyjątku StopIteration wykonywanie pętli
zostaje przerwane.
Kiedy mamy kolekcję typów danych, to naturalne jest, że chcemy przeprowadzać iteracje
przechowywanych tam danych.
Typ danych umożliwiający iterację to taki, który może zwrócić pojedynczo każdy jego
element. Każdy obiekt posiadający metodę __iter__() lub każda sekwencja (na
przykład obiekt posiadający metodę __getitem__() pobierająca argumenty w postaci
liczb całkowitych, począwszy od zera) pozwala na iterację i jest iteratorem
(Summerfield, 2010, p.155).
Kiedy używamy pętli for element in iterator, Python w rzeczywistości wywołuje
funkcję iter(iteracja) w celu pobrania iteratora. Następnie w trakcie wykonywania
każdej pętli iteracji zostaje wywołana metoda iteratora – __next__() , której celem jest
pobranie kolejnego elementu. Po zgłoszeniu wyjątku StopIteration wykonywanie pętli
zostaje przerwane.
Kiedy mamy kolekcję typów danych, to naturalne jest, że chcemy przeprowadzać iteracje
przechowywanych tam danych.
Typ danych umożliwiający iterację to taki, który może zwrócić pojedynczo każdy jego
element. Każdy obiekt posiadający metodę __iter__() lub każda sekwencja (na
przykład obiekt posiadający metodę __getitem__() pobierająca argumenty w postaci
liczb całkowitych, począwszy od zera) pozwala na iterację i jest iteratorem
(Summerfield, 2010, p.155).
Kiedy używamy pętli for element in iterator, Python w rzeczywistości wywołuje
funkcję iter(iteracja) w celu pobrania iteratora. Następnie w trakcie wykonywania
każdej pętli iteracji zostaje wywołana metoda iteratora – __next__() , której celem jest
pobranie kolejnego elementu. Po zgłoszeniu wyjątku StopIteration wykonywanie pętli
zostaje przerwane.
Kiedy mamy kolekcję typów danych, to naturalne jest, że chcemy przeprowadzać iteracje
przechowywanych tam danych.
Typ danych umożliwiający iterację to taki, który może zwrócić pojedynczo każdy jego
element. Każdy obiekt posiadający metodę __iter__() lub każda sekwencja (na
przykład obiekt posiadający metodę __getitem__() pobierająca argumenty w postaci
liczb całkowitych, począwszy od zera) pozwala na iterację i jest iteratorem
(Summerfield, 2010, p.155).
Kiedy używamy pętli for element in iterator, Python w rzeczywistości wywołuje
funkcję iter(iteracja) w celu pobrania iteratora. Następnie w trakcie wykonywania
każdej pętli iteracji zostaje wywołana metoda iteratora – __next__() , której celem jest
pobranie kolejnego elementu. Po zgłoszeniu wyjątku StopIteration wykonywanie pętli
zostaje przerwane.
Out: 1 a Out: 1 a
2 b 2 b
3 c 3 c
Out: 1 a Out: 1 a
2 b 2 b
3 c 3 c
Out: 1 a Out: 1 a
2 b 2 b
3 c 3 c
Funkcja zip() pozwala na wykorzystanie pętli for do równoległego przejścia większej liczby
sekwencji.
In[42]: In[43]:
1 A = [1, 2, 3, 4] 1 A = [1, 2, 3]
2 B = [8, 8, 8, 8] 2 B = [8, 8, 8, 8, 8, 8]
3 C = [1, 1, 1, 1] 3 C = [1, 1, 1, 1, 1]
4 for a, b, c in zip(A, B, C): 4 for a, b, c in zip(A, B, C):
5 wynik = a + b + c 5 wynik = a + b + c
6 print(a,b,c, ’=’, wynik) 6 print(a,b,c, ’=’, wynik)
Funkcja zip() pozwala na wykorzystanie pętli for do równoległego przejścia większej liczby
sekwencji.
In[44]: In[45]:
1 A = [1, 2, 3, 4] 1 A = [1, 2, 3]
2 B = [8, 8, 8, 8] 2 B = [8, 8, 8, 8, 8, 8]
3 C = [1, 1, 1, 1] 3 C = [1, 1, 1, 1, 1]
4 for a, b, c in zip(A, B, C): 4 for a, b, c in zip(A, B, C):
5 wynik = a + b + c 5 wynik = a + b + c
6 print(a,b,c, ’=’, wynik) 6 print(a,b,c, ’=’, wynik)
Out: 1 1 8 1 = 10
2 2 8 1 = 11
3 3 8 1 = 12
4 4 8 1 = 13
Funkcja zip() pozwala na wykorzystanie pętli for do równoległego przejścia większej liczby
sekwencji.
In[46]: In[47]:
1 A = [1, 2, 3, 4] 1 A = [1, 2, 3]
2 B = [8, 8, 8, 8] 2 B = [8, 8, 8, 8, 8, 8]
3 C = [1, 1, 1, 1] 3 C = [1, 1, 1, 1, 1]
4 for a, b, c in zip(A, B, C): 4 for a, b, c in zip(A, B, C):
5 wynik = a + b + c 5 wynik = a + b + c
6 print(a,b,c, ’=’, wynik) 6 print(a,b,c, ’=’, wynik)
Out: 1 1 8 1 = 10 Out: 1 1 8 1 = 10
2 2 8 1 = 11 2 2 8 1 = 11
3 3 8 1 = 12 3 3 8 1 = 12
4 4 8 1 = 13
Funkcja zip(i1, i2, ..., iN) - zwraca iterator krotek, używając iteratorów od i1 do iN
Funkcja zip(i1, i2, ..., iN) - zwraca iterator krotek, używając iteratorów od i1 do iN
Funkcja enumerate zwraca obiekt generatora — rodzaj obiektu obsługujący protokół iteracji
(więcej na kolejnych wykładach). W skrócie, obsługuje on metodę __next__ wywoływaną za
pomocą funkcji wbudowanej next i zwracającą za każdym przejściem pętli krotkę
(indeks, wartość).
Funkcja enumerate(i, start) używana jest w pętlach for...in .. w celu dostarczenia
sekwencji (indeks,element) krotek o indeksie startującym od zera lub od wartości start.
In[50]: In[51]:
1 L = [3, 4, 5 ] 1 L = [3, 4, 5 ]
2 for (i, e) in enumerate(L): 2 for (i, e) in enumerate(L, 10):
3 print(i, e) 3 print(i, e)
Out: 1 0 3 Out: 1 10 3
2 1 4 2 11 4
3 2 5 3 12 5
koniec elementów
element w sekwencji
zbioru wyjście z pętli
danych
blok kodu
blok kodu
In[55]:
for 1 suma = 0
2 for element in [1, 2, 3, 4]:
3 wynik = element + 5
4 suma += wynik # suma=suma+wynik
koniec elementów
element w sekwencji
5 print(’w pętli’, suma)
zbioru wyjście z pętli
6 print(’suma skumulowana:’, wynik)
danych
blok kodu
In[56]:
for 1 suma = 0
2 for element in [1, 2, 3, 4]:
3 wynik = element + 5
4 suma += wynik # suma=suma+wynik
koniec elementów
element w sekwencji
5 print(’w pętli’, suma)
zbioru wyjście z pętli
6 print(’suma skumulowana:’, wynik)
danych
Out: 1 w pętli 6
2 w pętli 13
3 w pętli 21
4 w pętli 30
blok kodu 5 suma skumulowana: 9
for In[57]:
1 A = [] # utworzenie pustej listy
2 for element in [1, 2, 3, 4]:
3 wynik = element + 5
koniec elementów A.append(wynik)
element w sekwencji
4
zbioru 5 print(A)
wyjście z pętli
danych
blok kodu
for In[58]:
1 A = [] # utworzenie pustej listy
2 for element in [1, 2, 3, 4]:
3 wynik = element + 5
koniec elementów A.append(wynik)
element w sekwencji
4
zbioru 5 print(A)
wyjście z pętli
danych
Out: 1 [6, 7, 8, 9]
blok kodu
for In[59]:
1 A = [] # utworzenie pustej listy
2 for element in [1, 2, 3, 4]:
3 wynik = element + 5
koniec elementów A.extend([wynik]) #iterowalny!
element w sekwencji
4
zbioru 5 print(A)
wyjście z pętli
danych
blok kodu
for In[60]:
1 A = [] # utworzenie pustej listy
2 for element in [1, 2, 3, 4]:
3 wynik = element + 5
koniec elementów A.extend([wynik]) #iterowalny!
element w sekwencji
4
zbioru 5 print(A)
wyjście z pętli
danych
Out: 1 [6, 7, 8, 9]
blok kodu
for In[61]:
1 A = [] # utworzenie pustej listy
2 for element in [1, 2, 3, 4]:
3 wynik = element + 5
koniec elementów A.append([element, wynik])
element w sekwencji
4
zbioru 5 print(A)
wyjście z pętli
danych
blok kodu
for In[62]:
1 A = [] # utworzenie pustej listy
2 for element in [1, 2, 3, 4]:
3 wynik = element + 5
koniec elementów A.append([element, wynik])
element w sekwencji
4
zbioru 5 print(A)
wyjście z pętli
danych
Out: 1 [[1, 6], [2, 7], [3, 8], [4, 9]]
blok kodu
for In[63]:
1 A = [] # utworzenie pustej listy
2 for element in [1, 2, 3, 4]:
3 wynik = element + 5
koniec elementów A.extend([element, wynik])
element w sekwencji
4
zbioru 5 print(A)
wyjście z pętli
danych
blok kodu
for In[64]:
1 A = [] # utworzenie pustej listy
2 for element in [1, 2, 3, 4]:
3 wynik = element + 5
koniec elementów A.extend([element, wynik])
element w sekwencji
4
zbioru 5 print(A)
wyjście z pętli
danych
Out: 1 [1, 6, 2, 7, 3, 8, 4, 9]
blok kodu
blok kodu
for
In[67]:
1 A = set() # pusty zbioru
2 for element in set({1,2,3,4}):
koniec elementów
3 wynik = element + 5
element w sekwencji 4 A.update([wynik]) #iterowalny!
zbioru wyjście z pętli 5 print(A)
danych
blok kodu
for
In[68]:
1 A = set() # pusty zbioru
2 for element in set({1,2,3,4}):
koniec elementów
3 wynik = element + 5
element w sekwencji 4 A.update([wynik]) #iterowalny!
zbioru wyjście z pętli 5 print(A)
danych
Out: 1 {8, 9, 6, 7}
blok kodu
for
In[69]:
1 A = ’’ # pusty łańcuch znaków
koniec elementów
element w sekwencji
2 for element in ’łańcuch znaków’:
zbioru wyjście z pętli
3 A += ’ ’ + element
danych 4 print(A)
blok kodu
for
In[70]:
1 A = ’’ # pusty łańcuch znaków
koniec elementów
element w sekwencji
2 for element in ’łańcuch znaków’:
zbioru wyjście z pętli
3 A += ’ ’ + element
danych 4 print(A)
Out: 1 ł a ńc u c h z n a k ów
blok kodu
for
In[71]:
1 A = {} # pusty słownik
koniec elementów
element w sekwencji
2 for i in range(0,5):
zbioru wyjście z pętli
3 A.setdefault(’result’, [])
danych 4 A[’result’].append(i)
5 print(A)
blok kodu
for
In[72]:
1 A = {} # pusty słownik
koniec elementów
element w sekwencji
2 for i in range(0,5):
zbioru wyjście z pętli
3 A.setdefault(’result’, [])
danych 4 A[’result’].append(i)
5 print(A)
Out: 1 {’result’: [0, 1, 2, 3, 4]}
blok kodu
for
In[73]:
1 A = {} # pusty słownik
koniec elementów
element w sekwencji
2 for i in range(4):
zbioru wyjście z pętli
3 result = ’key’ + str(i)
danych 4 A[result] = i
5 print(A)
blok kodu
for
In[74]:
1 A = {} # pusty słownik
koniec elementów
element w sekwencji
2 for i in range(4):
zbioru wyjście z pętli
3 result = ’key’ + str(i)
danych 4 A[result] = i
5 print(A)
Out: 1 {’key0’: 0, ’key1’: 1, ’key2’: 2,
’key3’: 3}
blok kodu
Pętle zagnieżdżone (ang. nested loops), tzw. pętle w pętli), wykorzystywane są do przebiegu
po kolekcjach wielopoziomowych np. listy list, słownika którego wartości są sekwencją etc.
In[75]: In[76]:
1 A = [[’a’, ’b’], [1, 2]] 1 A = {’a’:[1,2], ’b’: [11,22]}
2 for lista in A: 2 for key, val in A.items():
3 print(’lista’, lista) 3 print(’key, val’, key, val)
4 for e in lista: 4 for e in val:
5 print(e) 5 print(e)
Pętle zagnieżdżone (ang. nested loops), tzw. pętle w pętli), wykorzystywane są do przebiegu
po kolekcjach wielopoziomowych np. listy list, słownika którego wartości są sekwencją etc.
In[77]: In[78]:
1 A = [[’a’, ’b’], [1, 2]] 1 A = {’a’:[1,2], ’b’: [11,22]}
2 for lista in A: 2 for key, val in A.items():
3 print(’lista’, lista) 3 print(’key, val’, key, val)
4 for e in lista: 4 for e in val:
5 print(e) 5 print(e)
Out: 1 lista [’a’, ’b’] Out: 1 key, val a [1, 2]
2 a 2 1
3 b 3 2
4 lista [1, 2] 4 key, val b [11, 22]
5 1 5 11
6 2 6 22
Out[28]: 1 [3, 4, 5, 6]
Out[28]: 1 [3, 4, 5, 6]
In[84]:
1 lista = [e + 3 for e in range(4)]
2 print(lista)
Out: 1 [3, 4, 5, 6]
Out: 1 [5, 6]
Out: 1 [5, 6]
In[90]:
1 lista = [e + 3 for e in range(4) if e >= 2]
2 print(lista)
Out: 1 [5, 6]
In[96]:
1 f_s = {nazwa:os.path.getsize(nazwa) for nazwa in os.listdir(".")}
Po pętli for można umieścić instrukcje else. Kod pod instrukcją else wykonywany jest tylko
gdy pętla jest "wyczerpana". Instrukcja else nie wykona się gdy przerwiemy przejścia
instrukcją break lub gdy zostanie zgłoszony wyjątek (ang. exception raised).
In[103]: In[104]:
1 for i in range(4): 1 for i in range(4):
2 print(i) 2 print(i)
3 else: 3 if i == 2:
4 print("zrobione") 4 break
5 else:
Out: 1 0 6 print("zrobione")
2 1
3 2 Out: 1 0
4 3 2 1
5 zrobione 3 2
Out: 1 even 0
2 even 2
3 even 4
4 even 6
5 even 8
sum(i, start) - zwraca sumę elementów w iteracji i plus początek (którego wartość
domyślna wynosi 0). Iterator i nie może zawierać ciągów tekstowych.
zip(i1, i2, ..., iN) - zwraca iterator krotek, używając iteratorów od i1 do iN.