Liczby losowe i pętla while w języku Python Mateusz Miotk 17 stycznia 2017 Instytut Informatyki UG 1
Generowanie liczb losowych Na ogół programy są spójne i prowadzą do przewidywanych wyników. Czasem jednak nieprzewidywalność w programach komputerowych jest ciekawa (zmiana strategii przeciwnika itd). Jednym z przykładów takiej nieprzewidywalności są liczby losowe. 2
Generowanie liczb losowych Na ogół programy są spójne i prowadzą do przewidywanych wyników. Czasem jednak nieprzewidywalność w programach komputerowych jest ciekawa (zmiana strategii przeciwnika itd). Jednym z przykładów takiej nieprzewidywalności są liczby losowe. Pułapka W językach programowania liczby losowe są generowane na podstawie wzoru matematycznego, więc nie są one prawdziwie losowe. Mówi się o nich, że są to liczby pseudolosowe i wystarczają w przypadku większości aplikacji. 2
Przykładowy kod programu losujący liczby Weźmy następujący kod programu: import random die1 = random.randint(1,6) die2 = random.randrange(6) total = die1 + die2 print("wyrzuciles ", die1, " oraz ",die2, " razem ", total) raw_input() 3
Import modułu random Linijka import random jest załadowaniem modułu. Moduły są to pliki, które zawierają kod przeznaczony do wykorzystywania w innych programach. W przypadku modułu random jest on odpowiedzialny za funkcję związane z generowaniem liczb pseudolosowych. 4
Funkcja randint() Moduł random zawiera funkcję randint(), która generuje losową liczbę całkowitą. Funkcja randint() wymaga podania dwóch argumentów w postaci liczb całkowitych i zwraca losową liczbę całkowitą o wartości mieszczącej się w przedziale wyznaczonym przez argumenty do które one należą. Tak więc randint(1,6) wylosuje jedną z liczb: 1,2,3,4,5 lub 6. 5
Funkcja randrange() Moduł random zawiera również funkcję randrange(), która generuje liczbę całkowitą. Istnieje kilka sposobów wywołania funkcji randrange(), ale najprostszym jest użycie pojedyńczego argumentu w postaci dodatniej liczby całkowitej. Wówczas wylosowana zostanie liczba całkowita z przedziału <0,liczba_w_argumencie>. Tak więc wynikiem randrange(6) będzie jedna z liczb: 0,1,2,3,4 lub 5. 6
Klauzula elif Rozważmy następujący kod programu: import random number = random.randint(1,3) if number == 1: print("wylosowano liczbe 1") elif number == 2: print("wylosowano liczbe 2") else: print("wylosowano liczbe 3") raw_input() 7
Klauzula elif Rozważmy następujący kod programu: import random number = random.randint(1,3) if number == 1: print("wylosowano liczbe 1") elif number == 2: print("wylosowano liczbe 2") else: print("wylosowano liczbe 3") raw_input() Program losuje jedną z liczb 1,2,3 oraz sprawdza, która liczba została wylosowana. 7
Klauzula elif Instrukcja if z klauzulami elif może zawierać ciąg warunków do sprawdzenia przez program. Warto zauważyć, że pierwszy warunek zapisuje się przy pomocy if, ale pozostałe warunki sprawdza się przy użyciu klauzuli elif. Klauzula else jak wiemy dotyczy pozostałych warunków nie wymienionych w instrukcjach if oraz elif. Pułapka Ważną cechą instrukcji if zawierającej klauzulę elif jest fakt, że gdy tylko okaże się, że jakiś warunek ma wartość True, komputer wykona odpowiadający mu blok kodu i nastąpi wyjście z instrukcji. To oznacza, że zostanie wykonany tylko jeden blok kodu. 8
Podsumowanie instrukcji służących do rozgałęziania kodu Instrukcja if <warunek>: <blok_kodu> if <warunek>: <blok_kodu_1> else: <blok_kodu_2> if <warunek1>: <blok_kodu_1> elif <warunek2>: <blok_kodu_2>... elif <warunek N>: <blok_kodu_n> else: <blok_kodu_else> Opis Instrukcja if. Jeśli <warunek> jest spełniony, <blok_kodu> jest wykonywany W przeciwnym przypadku jest pomijany Instrukcja if z klauzulą else. Jeśli jest spełniony, Wykonywany jest <blok_kodu_1>. W przeciwnym przypadku Wykonywany jest <blok_kodu_2 Instrukcja if z klauzulą elif i opcjonalną klauzulą else Wykonywany jest blok pierwszego spełnionego warunku Jeśli żaden warunek nie jest spełniony, wykonywany jest blok opcjonalnej klauzuli else 9
Tworzenie pętli w programie Przypuśćmy, że chcemy utworzyć program, który będzie pytał nas o wprowadzenie liczby dopóki nie wprowadzimy liczby 0. Program ma zakończyć działanie dopiero w momencie wprowadzenia liczby 0 przez użytkownika. W tym wypadku program będzie potrzebował następującej instrukcji: Dopóki nie wprowadziłeś liczby 0 wprowadzaj liczbę. To powtarzanie czynności w programowaniu nazywamy pętlami. W Pythonie istnieją różne pętle, ale szczególnie używa się pętli while oraz for. 10
Przykładowy program z użyciem pętli while Program z poprzedniego slajdu może wyglądać następująco: number = "" while number!= 0: number = int(raw_input("podaj liczbe calkowita: ")) print("wprowadziles liczbe zero. Koncze program!") raw_input() 11
Pętla while Format pętli while wygląda bardzo podobnie jak instrukcja if. Jedyna różnica polega na zastępieniu słowa if słowem while. Natomiast w obu typach instrukcji, jeśli warunek jest spełniony, blok kodu (a w przypadku pętli while blok kodu nazwiemy ciało pętli) jest wykonywany. Lecz w instrukcji while komputer sprawdza warunek i wykonuje blok kodu raz po raz dopóki warunek nie okaże się fałszywy. Jest to charakterystyczna cecha dla pętli. 12
Rola wartownika Pętle while są często kontrolowane przez wartownika - zmienną używaną w warunku i porównywaną z jakąś inną wartością lub wartościami. W naszym przykładzie role wartownika pełni zmienna number. Uwaga Wartownik musi być utworzony przed wykonaniem pętli while!!! Upewnij się, że istnieje możliwość, iż warunek pętli przyjmie w pewnym momencie wartość True. W przeciwnym wypadku ciało pętli może się nigdy nie wykonać. Unikaj pętli nieskończonych, czyli takich w których nigdy nie zajdzie w warunku pętli wartość True. 13
Przykłady błędnych pętli Rozważmy następujący kod programu: number = 0 while number!= 0: number = int(raw_input("podaj liczbe calkowita: ")) print("wprowadziles liczbe zero. Koncze program!") raw_input() W tym przypadku pętla nigdy się nie wykona! 14
Przykłady błędnych pętli Rozważmy następujący blok programu: number = 10 while number!= 0: print("liczba: ", number) number -= 3 print("petla sie skonczyla. Koncze program!") raw_input() Ten program nigdy się nie zakończy. Dlaczego? 15
Debugowanie programu Poprzedni program zawierał błąd logiczny. Z reguły błędy logiczne są trudne do wykrycia przez programistę. Jedynym wyjściem jest śledzenie programu. Śledzenie (lub inaczej debugowanie) polega na tym, że symuluje się pracę programu i robi się dokładnie to, co program, podążając śladem każdej instrukcji oraz rejestrując wartość przypisywanym zmiennym. W ten sposób krok po kroku można dokładnie zrozumieć, co się dzieje w każdym jego miejscu i wykryć okoliczności, które prowadzą do błędów. 16
Poprawiona wersja poprzedniego programu number = 10 while number > 0: print("liczba: ", number) number -= 3 print("petla sie skonczyla. Koncze program!") raw_input() 17
Program na istnienie zmiennej Rozważmy następujący kod programu: number = int(raw_input("witaj. Podaj liczbe calkowita: ")) if number: print("podales liczbe: ", number) else: print("nie podales liczby!") raw_input() 18
Sprawdzanie czy istnieje zmienna Wiersz if number nie jest porównywalna z jakąkolwiek inną wartością. Gdy dochodzi do wyznaczenia liczby traktowanej jako warunek, wartość zero oznacza False, a dowolna inna wartość True. Tak więc powyższa linia jest równoważna if number!= 0, ale pierwsza wersja uważana jest za bardziej elegancką i intulicyjną. Główna zasada przy sprawdzeniu istnienia zmiennej jest następująca: Każda wartość pusta lub zerowa jest traktowana jako False, natomiast pozostałe są traktowane jako True. Dotyczy to także liczb ujemnych. 19
Korzystanie z warunków złożonych Warunki używane do tej pory były warunkami prostymi - składały się tylko z jednej operacji. Proste warunki można łączyc ze sobą przy pomocy operatorów logicznych. W ten sposób połączone ze sobą warunki proste stają się warunkami złożonymi. 20
Korzystanie z warunków złożonych Warunki używane do tej pory były warunkami prostymi - składały się tylko z jednej operacji. Proste warunki można łączyc ze sobą przy pomocy operatorów logicznych. W ten sposób połączone ze sobą warunki proste stają się warunkami złożonymi. Przykład: number = 0 while number >= 0 and number <=100: number = int(raw_input("podaj liczbe spoza zakresu <0,100>: ") print("podales: ", number. Wychodze z programu!) raw_input() 20
Operator and Wiersz while number >= 0 and number <=100: składa się z dwóch warunków prostych. Po pierwsze zmienna number musi być większa bądź równa 0 oraz mniejsza bądź równa 100. W tym przypadku użytkownik musi wprowadzić inną liczbę. Program wyjdzie z pętli, kiedy nie będą spełnione obydwa warunki jednocześnie! To charakteryzuje użycie operatora and. 21
Operator or Rozważmy następujący kod programu: number = 0 while number >= 100 or number <=0: number = int(raw_input("podaj liczbe spoza zakresu (0,100): ") print("podales: ", number. Wychodze z programu!) raw_input() 22
Operator or Rozważmy następujący kod programu: number = 0 while number >= 100 or number <=0: number = int(raw_input("podaj liczbe spoza zakresu (0,100): ") print("podales: ", number. Wychodze z programu!) raw_input() Wiersz while number >= 100 or number <=0: składa się także z dwóch warunków prostych. Po pierwsze jeśli zmienna number będzie większa od 100 lub mniejsza od zera, to użytkownik zostanie poproszony o wprowadzenie liczby. W tym przypadku wejście z pętli zajdzie jeśli będzie spełniony przynajmniej jeden z warunków prostych. 22
Operator not Rozważmy następujący kod programu: number = -1 while not number >= 0: number = int(raw_input("podaj liczbe wieksza od zera: ")) print("podales: ", number. Wychodze z programu!) raw_input() 23
Operator not Rozważmy następujący kod programu: number = -1 while not number >= 0: number = int(raw_input("podaj liczbe wieksza od zera: ")) print("podales: ", number. Wychodze z programu!) raw_input() Wiersz while not number >= 0: składa się z jednego warunku prostego.jeśli zmienna number nie będzie większa od 0, to użytkownik zostanie poproszony o wprowadzenie liczby. 23
Bibliografia Micheal Dawson, PYTHON dla każdego. Podstawy programowania. Wydanie III, Helion, 2014. 24