TI/Programowanie dla Fizyków Medycznych:Instrukcje sterowania
Spis treści
Sterowanie przebiegiem programu
W Pythonie sterowanie przebiegiem wykonania programu realizowane jest za pomocą instrukcji warunkowych i pętli. Obie konstrukcje wymagają pisania wyrażeń logicznych. W Pythonie następujące obiekty są interpretowane jako fałsz:
- pusty struktury danych (napis, lista, krotka, słownik, zbiór)
- zera (0, 0., 0j i 0L)
- wartość None
- obiekty klas, które definiują metodę __len__() lub __nonzero__() i zwrócą one odpowiednio 0 lub False
- wartość False
>>> class C(object):
def __len__(self):
return 0
>>> class D(object):
def __nonzero__(self):
return False
>>> A = [None, 0, 0., 0j, 0L, [], (), '', {}, set(), C(), D(), False]
>>> [bool(x) for x in A]
[False, False, False, False, False, False, False, False, False, False, False, False, False]
Wszystkie pozostałe obiekty wartości są interpretowane jako prawda (True). Do obliczania wartości wyrażeń logicznych można wykorzystać dwuargumentowe leniwe (sprawdzają wartości logiczne do czasu ustalenia wartości logicznej całego wyrażenia) operatory logiczne:
- and - koniunkcja - zwraca wartość pierwszego argumentu jeśli odpowiada on wartości logicznej fałsz i drugiego w przeciwnym wypadku, wartość logiczna drugiego argumentu jest obliczana tylko gdy wartość pierwszego argumentu była True
- or - alternatywa - zwraca wartość pierwszego argumentu jeśli odpowiada on wartości logicznej prawda i drugiego w przeciwnym wypadku, wartość logiczna drugiego argumentu jest obliczana tylko gdy wartość pierwszego argumentu była False
I operator jednoargumentowy not zwracający wartość logiczną przeciwną do zadanego argumentu. Fakt, że operatory logiczne nie zwracają po prostu wartości True i False, ale oryginalne wartości swoich argumentów może być wykorzystany w przypisaniach. Leniwość operatorów logicznych z jednej strony pozwala na pisanie zabezpieczeń przed np. pobieraniem argumentu spoza listy, ale z drugiej sprawia, że operatory przestają być przemienne:
>>> 'Ala' or 'Basia'
'Ala'
>>> [] and 'Basia'
[]
>>> () and {'a' : 1, 'b' : 2}
()
>>> A = [1, 2, 3]
>>> len(A) > 3 and A[3]
False
>>> A[3] and len(A) > 3
Traceback (most recent call last):
File "<pyshell#27>", line 1, in <module>
A[3] and len(A) > 3
IndexError: list index out of range
Instrukcja warunkowa if składa się z warunku, listy instrukcji, które mają być wykonane gdy warunek jest spełniony, możliwe jest dodanie warunków i list instrukcji, które są testowane i wykonywane w przypadku niespełnienia wcześniejszych warunków (bloki elif) lub listy instrukcji, która jest wykonywana w przypadku niespełnienia żadnego z warunków (blok else). Jeśli, któryś z warunków zostanie spełniony, to następne nie są już sprawdzane:
if A == 1:
print 'A jest równe 1'
elif A == 2:
print 'A jest równe 2'
elif A == 3:
print 'A jest równe 3'
else:
print 'A nie jest równe 1, 2, ani 3'
W Pythonie dostępne są dwie pętle:
- pętla for, która wykonywana jest określoną ilość razy (dla każdego elementu zadanej sekwencji, którą może być na przykład lista czy napis)
- pętla while, która wykonywana jest dopóki zadany warunek jest spełniony
>>> for i in ['A', 'B', 'C', 'D']:
print ord(i)
65
66
67
68
>>> for i in ['A', 'B', 'C', 'D']:
print i, ord(i)
A 65
B 66
C 67
D 68
>>> for i in 'napis':
print i
n
a
p
i
s
>>> for i, j in enumerate('napis'):
print i, j
0 n
1 a
2 p
3 i
4 s
>>> import random
>>> i = 1
>>> while i < 10:
print i
i += random.randint(0, i)
1
2
2
2
3
4
6
>>> i = 1
>>> while i < 10:
print i
i += random.randint(0, i)
1
1
2
2
2
2
2
2
3
4
8
9
Obie pętle można opuścić w dowolnym momencie za pomocą instrukcji break:
>>> while True:
i = random.randint(0, 5)
if i == 1:
break
print i
2
5
3
>>> for i in [1, 2, 3, 4, 5]:
if i % 2 == 0 and i > 3:
break
print i
1
2
3
Po ciele pętli while można wstawić blok else, który będzie wykonany jeśli pętla nie zakończyła się przez wykonanie break:
import random
i = 0
while i != 10:
i = random.randint(0, 11)
print i
if i == 5:
print 'zakończenie przy pomocy break'
break
else:
print 'normalne zakończenie'
Podobnym poleceniem jest continue, dzięki niemu można z dowolnego miejsca pętli przejść do kolejnego jej wykonania:
>>> for i in [1, 2, 3, 4, 5, 6]:
if i % 2 == 0:
continue
print i
1
3
5
>>> i = 0
>>> while i < 10:
i += 1
if i % 2 == 0:
continue
print i
1
3
5
7
9
Bloki kodu w Pythonie są wyróżniane za pomocą wcięć - wszystkie instrukcje, które chcemy umieścić np. w bloku if muszą rozpoczynać się jednym wcięciem więcej niż sama instrukcja if, blok kończy się, gdy pojawi się pierwsza instrukcja rozpoczynająca się od mniejszej liczby wcięć. Pojawianie się kolejnych wcięć musi być związane z instrukcjami if, while, for, def czy class, które opisane są odpowiednio w rozdziałach o funkcjach i klasach.
Zadanie 1
Napisz skrypt w którym stworzysz listę, a następnie sprawdzisz czy na liście jest element występujący więcej niż połowę razy, zrób to na trzy sposoby:
- wykorzystując słownik i zliczając ile razy wystąpił każdy element
- sortując listę i sprawdzając czy element środkowy jest przywódcą
- przechodząc dokładnie raz listę - zastanów się jak można to zrobić
Zadanie 2
Napisz skrypt w którym stworzysz dwie posortowane listy liczb całkowitych, a następnie obliczysz ich sumę i przecięcie teoriomnogościowe. Zrób to na dwa sposoby:
- tworząc zbiory z list i wykorzystując operacje zaimplementowane w Pythonie
- przeglądając w pętli obie listy
Zadanie 3
Napisz skrypt zliczający wsystąpienia słów w podanym pliku, nie rozróżniajmy małych i wielkich liter.
Zadanie 4
Napisz skrypt wczytujący plik a następnie przygotuj słownik, którego kluczami będą słowa występujące w pliku, a wartościami listy zawierające słowa, które wystąpiły po kluczu. Należy przyjąć, że przed pierwszym słowem w pliku i po każdej kropce występuje słowo puste. Następnie rozpoczynając od słowa pustego biorąc za każdym razem losowe słowo, które zgodnie z stworzonym słownikiem może wystąpić po danym stwórz teks długości 200 słów. Gdy wpiszesz słowo nie będące kluczem w słowniku rozpocznij od słowa pustego.