Języki i metody programowania Wykład 3 dr hab. Bożena Woźna-Szcześniak bwozna@gmail.com Instytut Matematyki i Informatyki Akademia Jana Długosza w Częstochowie hab. Andrzeja Zbrzezngo
Wartości boolowskie Wartość logiczna to w logice podstawowa cecha zdania określajaca jego stosunek do faktów. W logice klasycznej każde zdanie może przyjać tylko jedna z dwóch wartości logicznych: prawda oznaczajaca zgodność zdania ze zbiorem faktów fałsz oznaczajaca niezgodność zdania ze zbiorem faktów W języku Python stała wbudowana False reprezentuje wartość logiczna fałsz, natomiast stała wbudowana True reprezentuje wartość logiczna prawda. Obiekty False i True sa jedynymi wartościami typu bool.
Wartości boolowskie Typ bool jest podtypem typu int, a zatem wywołanie funkcji wbudowanej issubclass(bool, int) zwróci wartość True: >>> issubclass(bool, int) True >>> issubclass(int, int) True >>> issubclass(int, float) False W prawie wszystkich kontekstach wartości boolowskie False i True zachowuja się jak wartości 0 i 1, odpowiednio. Wyjatkiem jest to, że po przekonwertowaniu wartości boolowskiej na łańcuch, zwracany jest łańcuch 'False' lub 'True'.
Wartości boolowskie Każdy obiekt może być w razie potrzeby potraktowany jako wartość boolowska. Następujace obiekty sa traktowane jako wartość False: None False zero z każdego typu numerycznego, przykładowo: 0, 0.0, 0j dowolna pusta sekwencja, przykładowo: '', (), [] dowolne puste odwzorowanie, przykładowo: {}. instancje klas zdefiniowanych przez użytkownika, o ile w klasie zdefiniowana jest metoda bool () lub metoda len () oraz metody te zwracaja dla tych instancji liczbę całkowita zero lub wartość boolowska False. Wszystkie pozostałe wartości traktowane sa jak wartość boolowska True.
Wartości boolowskie Funkcja wbudowana bool zwraca dla każdego obiektu jego wartość logiczna określona zgodnie z powyższymi regułami. >> bool(none) False >> bool(6) True >> bool("") False >> bool("python. Programming is fun again!") True >> bool([]) False >> bool([10, 20, 30, 40]) True
Operatory boolowskie and, or, not Rezultaty działań z użyciem operatorów boolowskich opisane sa w poniższej tabeli, w kolejności rosnacych priorytetów: Operator Wynik Uwagi x or y jeżeli bool(x) == False, to y, (1) w przeciwnym razie x x and y jeżeli bool(x) == False, to x, (2) w przeciwnym razie y not x jeżeli bool(x) == False, to True, (3) w przeciwnym razie False Uwagi: 1 Argument y jest obliczany tylko wtedy, gdy bool(x) == False. 2 Argument y jest obliczany tylko wtedy, gdy bool(x) == True. 3 Operator not ma priorytet mniejszy niż nieboolowskie operatory.
Operatory boolowskie and, or, not >>> 5 or 8 5 >>> 5 and 8 8 >>> not 5 and 8 False >>> 8 and 5 < 8 True >>> 5 < 8 and 8 8 >>> not 5!= 8 False >>> (not 5)!= 8 True
Prosta instrukcja warunkowa Składnia prostej instrukcji warunkowej jest następujaca: if wyrażenie: blokinstrukcji Wykonanie prostej instrukcji warunkowej zaczyna się od obliczenia wartości boolowskiej wyrażenia wyrażenie. Jeżeli wartościa ta jest True, to wykonywany jest blokinstrukcji.
Schemat blokowy prostej instrukcji warunkowej False wyrażenie True blokinstrukcji
Przykład (Suma liczb dodatnich i suma liczb ujemnych) def main(): n = int(input("ilość liczb do wczytania: ")) suma_dod = suma_ujem = 0 for j in range(0, n): a = float(input("podaj kolejną liczbę: ")) if a > 0: suma_dod = suma_dod + a if a < 0: suma_ujem = suma_ujem + a print("suma liczb dodatnich =", suma_dod) print("suma liczb ujemnych =", suma_ujem) main()
Przykład (Ilość oraz suma liczb dodatnich i liczb ujemnych) def main(): n = int(input("ilość liczb do wczytania: ")) ile_dod = ile_ujem = 0; suma_dod = suma_ujem = 0.0 for j in range(0, n): a = float(input("podaj kolejną liczbę: ")) if a > 0: ile_dod = ile_dod + 1 suma_dod = suma_dod + a if a < 0: ile_ujem = ile_ujem + 1 suma_ujem = suma_ujem + a print("ilość dodatnich =", ile_dod, end = " ") print("suma dodatnich =", suma_dod) print("ilość ujemnych =", ile_dod, end = " ") print("suma ujemnych =", suma_ujem)
Instrukcja warunkowa Składnia instrukcji warunkowej jest następujaca: if wyrażenie: blokinstrukcji_t else: blokinstrukcji_f Wykonanie instrukcji warunkowej zaczyna się od obliczenia wartości boolowskiej wyrażenia wyrażenie. Jeżeli wartościa ta jest True, to wykonywany jest blokinstrukcji_t. W przeciwnym razie wykonywany jest blokinstrukcji_f.
Schemat blokowy instrukcji warunkowej True False wyrażenie blokinstrukcji T blokinstrukcji F
Przykład (Suma liczb dodatnich i suma liczb ujemnych) def main(): y = int(input("podaj rok: ")) print("rok", y, "ma", number_of_days(y), "dni.") def number_of_days(y): if y % 4 == 0 and y % 100!= 0 or y % 400 == 0: return 366 else: return 365 if name == " main ": main()
Pełna postać instrukcji warunkowej Składnia pełnej instrukcji warunkowej jest następujaca: if wyrażenie: blokinstrukcji_t elif wyrażenie_1 blokinstrukcji_1... elif wyrażenie_n blokinstrukcji_n else: blokinstrukcji_f
Schemat blokowy pełnej instrukcji warunkowej True wyrażenie False True wyrażenie 1 False blokinstrukcji 1 blokinstrukcji T blokinstrukcji F
Przykład (Pierwiastki rzeczywiste równania kwadratowego) import math def wypisz_pierwiastki(a, b, c): delta = b * b - 4 * a * c if delta > 0: print("równanie ma dwa pierwiastki") print("x1 =", (-b - math.sqrt(delta)) / (2 * a)) print("x2 =", (-b + math.sqrt(delta)) / (2 * a)) elif delta == 0: print("równanie ma podwójny pierwiastek") print("x1 = x2 = ", -b / (2 * a)) else: print("równanie nie ma pierwiastków")
Instrukcja iteracyjna while (dopóki) Ogólna postać instrukcji iteracyjnej while jest następujaca: while wyrażenie: blokinstrukcji else: blokintrukcjielse przy czym fragment else: blokintrukcjielse może nie wystapić. Instrukcja iteracyjna while jest używana do wykonywania bloku instrukcji tak długo, jak długo wartościa logiczna wyrażenia wyrażenie jest True.
Semantyka instrukcji iteracyjnej while Każdorazowo wartościowane jest wyrażenie występujace po słowie kluczowym while; jeśli jest ono prawdziwe, wykonywany jest blokinstrukcji. Jeśli za którymś razem (być może już za pierwszym) wartościa wyrażenia będzie False, następuje przerwanie wykonywania instrukcji iteracyjnej. Jeśli w instrukcji występuje klauzula else, to wykonywany jest zwiazany z nia ciag instrukcji.
Schemat blokowy instrukcji iteracyjnej while bez klauzuli else False warunek True blokinstrukcji
Przykład (Suma liczb od 1 do n) """Oblicza sumę liczb naturalnych od 1 do n""" #!/usr/bin/env python3 def main(): n = int(input("podaj liczbę naturalną: ")) s = 0 j = 1 while j <= n: s = s + j j = j + 1 print("suma liczb od 1 do", n, "wynosi", s) main()
Przykład (Ciag Collatza) def main(): n = int(input("podaj liczbę naturalną: ")) ciag3nplus1(n) def ciag3nplus1(n): while n > 1: print(n, end = ", ") if n % 2 == 0: n = n // 2 else: n = 3 * n + 1 print(n, end = ".\n") if name == " main ": main()
Przykład (Ilość cyfr w liczbie naturalnej) def main(): n = int(input("podaj liczbę naturalną dodatnią: ")) if n > 0: print("ilość cyfr liczby", n, ":", ile_cyfr(n)) else: print("skup się! Powiedziałem \"Dodatnią\"!") def ile_cyfr(n): ile = 0 while n > 0: ile += 1; n //= 10 return ile if name == " main ": main()