PPy3/InstrukcjaWarunkowa: Różnice pomiędzy wersjami

Z Brain-wiki
 
(Nie pokazano 13 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 1: Linia 1:
 
=Instrukcja warunkowa=
 
=Instrukcja warunkowa=
  
 +
Zasadniczo każdy program w Pythonie składa się z ciągu instrukcji, które są wykonywane w kolejności, w jakiej zostały zapisane. W programowaniu potrzebna jest jednak możliwość podejmowania decyzji o przyjęciu różnych kursów postępowania, w zależności od danych z jakimi mamy do czynienia. Umożliwiają to instrukcje złożone, a szczególnie - instrukcja warunkowa.
 +
 +
Instrukcja warunkowa to pierwszy przykład instrukcji złożonej. W najprostszej postaci składa się ona z ciągu (jednej lub więcej) instrukcji ujętych w blok, który jako całość będzie wykonany lub nie, w zależności od tego, czy spełniony jest pewien warunek - co zależy zazwyczaj od aktualnych wartości pewnych zmiennych. Warunek ten zapisuje się w postaci wyrażenia logicznego.
 +
 +
<blockquote><small>
 +
Wśród instrukcji tworzących blok warunkowy mogą oczywiście się pojawić również instrukcje złożone, nie tylko instrukcje proste. Na przykład, kolejne instrukcje warunkowe.
 +
</small></blockquote>
 +
 +
==Przykład minimalny:==
 +
 +
<source lang=python>
 +
x1, x2 = None, None
 +
if delta > 0 and not a == 0:
 +
    x1 = (-b + delta) / 2 / a
 +
    x2 = (-b - delta) / 2 / a
 +
print(x1, x2)
 +
</source>
 +
 +
Linijka z wywołaniem <tt>print</tt> nie jest już częścią instrukcji warunkowej, tylko kolejną instrukcją.
 +
 +
'''Do zapamiętania''':
 +
*wiersz otwierający instrukcję złożoną (czyli tu: zaczynająca się od <tt>if</tt>) zawsze kończy się dwukropkiem
 +
*instrukcje tworzące blok w instrukcji złożonej są pisane z wcięciem, które musi być jednolite &mdash; oczywiście jeżeli częścią bloku jest kolejna instrukcja złożona, to dodaje ona swoje, kolejne wcięcie
 +
*koniec bloku rozpoznaje się po powrocie do uprzedniego poziomu wcięcia
 +
*blok instrukcji pod <tt>if ...</tt> nie może być pusty. Instrukcja <tt>if</tt> z pustym blokiem warunkowym jest nie tylko nieprzydatna, ale jest również błędem składniowym. Jeżeli (tymczasowo?) chcemy pozostawić instrukcję warunkową bez wnętrza, to możemy tam wpisać instrukcję <tt>pass</tt> &mdash; jest to instrukcja pusta (,,nie rób nic").
 +
 +
==Przykład bardziej złożony:==
 +
 +
<source lang=python>
 +
if a == 0:
 +
    print('Równanie nie jest kwadratowe.')
 +
elif delta > 0 and not a == 0:
 +
    x1 = (-b + delta) / 2 / a
 +
    x2 = (-b - delta) / 2 / a
 +
    print('Są dwa pierwiastki: x1 =', x1, 'x2 =', x2)
 +
elif delta == 0:
 +
    x = -b / 2 / a
 +
    print('Jest tylko jeden pierwiastek: x =', x)
 +
else: # delta < 0:
 +
    print('Nie ma pierwiastków rzeczywistych.')
 +
</source>
 +
 +
Jak to działa?
 +
 +
*Jeżeli spełniony jest warunek <tt>a == 0</tt>, wykonany zostanie blok poniżej <tt>if ...</tt>, a reszta instrukcji zostanie pominięta;
 +
*Jeżeli warunek ten jest nieprawdziwy (i tylko wtedy), to sprawdzane są kolejno warunki umieszczone w wierszach zaczynających się od <tt>elif</tt>. Jeśli któryś z nich okaże się prawdziwy, to blok poniżej tej linijki zostanie wykonany, a cała reszta - pominięta;
 +
*Jeżeli żaden z warunków - tych po <tt>if</tt>, i tych po wszystkich <tt>elif</tt> - nie okazał się prawdziwy, wykonany zostanie blok związany z <tt>else</tt>.
 +
*Bloków <tt>elif</tt> może być w instrukcji dowolnie wiele (w tym - wcale), <tt>if</tt> jest obowiązkowy (inaczej nie byłoby instrukcji warunkowej) i tylko jeden, <tt>else</tt> może wystąpić wyłącznie na końcu - jeden raz, lub wcale.
 +
*Komentarz po <tt>else:</tt> jest podpowiedzią dla czytającego, że skoro już zbadano warunki <tt>delta == 0</tt> oraz <tt>delta > 0</tt>, a wykonanie dotarło do tej linijki, to <tt>delta < 0</tt> jest jedyną pozostałą możliwością (o ile możemy założyć, że <tt>delta</tt> jest na pewno liczbą!). Jest on przeznaczony wyłącznie dla ludzkich oczu - interpreter go zignoruje, jak każdy komentarz.
 +
 +
<blockquote><small>
 +
Mam nadzieję, że czytający już zauważył, że <tt>and not a == 0</tt> w trzeciej linijce jest niepotrzebne. Dlaczego?
 +
</small></blockquote>
 +
 +
==Wyrażenie warunkowe==
 +
 +
Innym sposobem uzależnienia wyniku działania od jakiegoś warunku jest tzw. ''wyrażenie warunkowe''. Jest ono szczególnie wygodne w prostych przypadkach, i pozwala zapisać pewne działania w bardziej zwięzły sposób.
 +
 +
Przykład: chcemy, aby z nazwą <tt>wbx</tt> wiązała się wartość bezwzględna (moduł) aktualnej wartości (liczby) <tt>x</tt>. Za pomocą instrukcji warunkowej można to zrealizować tak:
 +
 +
<source lang=python>
 +
if x < 0:
 +
    wbx = -x
 +
else:
 +
    wbx = x
 +
</source>
 +
 +
Ten sam wynik można osiągnąć za pomocą wyrażenia warunkowego:
 +
 +
<source lang=python>
 +
wbx = -x if x < 0 else x
 +
</source>
 +
 +
W wyrażeniu warunkowym nie ma opcji uwzględnienia dodatkowych możliwości za pomocą <tt>elif</tt>.
 +
 +
=Ćwiczenia=
 +
 +
W programach ćwiczebnych nieraz przyda nam się funkcja <tt>input()</tt>. Działa ona w sposób następujący: argumentem wywołania powinien być jakiś napis (np. w postaci stałej napisowej): <tt>input('podaj jakąś liczbę całkowitą: ')</tt>. Gdy w programie przyjdzie kolej na wykonanie takiego wywołania, program wypisze ten napis do terminalu i będzie oczekiwał na reakcję użytkownika, czyli wpisanie czegoś z klawiatury (i zakończenie naciśnięciem klawisza ''Enter''). Gdy to nastąpi, wynikiem wywołania funkcji <tt>input</tt> w programie będzie treść wpisana prze użytkownika (bez końcowego znaku nowej linii).
 +
 +
''Uwaga:'' wartość zwracana przez <tt>input()</tt> zawsze jest napisem, a nie liczbą - choćby się składał z samych cyfr.
 +
 +
1. Napisz program, którego uruchomienie ma następujący skutek:
 +
*program wita użytkownika (komunikatem w terminalu),
 +
*prosi o wprowadzenie liczby całkowitej,
 +
*sprawdza, czy liczba ta jest podzielna przez 7, i informuje o wyniku tego sprawdzenia
 +
 +
2. Napisz program, którego uruchomienie ma następujący skutek:
 +
* program prosi użytkownika o podanie swojego (lub czyjegoś) wieku w latach
 +
* jeśli wiek jest ujemny, odpowiada ,,Nieprawidłowy wiek"
 +
* jeśli wiek wynosi 0, odpowiada ,,niemowlę"
 +
* jeśli wiek jest poniżej 18, odpowiada ,,dziecko"
 +
* jeśli wiek jest pomiędzy 18 a 120 (włącznie), odpowiada ,,dorosły"
 +
* jeśli wiek przekracza 120, odpowiada ,,ludzie tyle nie żyją"
 +
 +
 +
''CDN''
  
 
----  
 
----  
  
[[PPy3/StałeIZmienne|poprzednia]] | [["Programowanie z Pythonem3"|Strona główna]] | [[Pętle|dalej]]
+
[[PPy3/StałeIZmienne|poprzednia]] | [["Programowanie z Pythonem3"|Strona główna]] | [[PPy3/SekwencjeIIteracja|dalej]]
  
  
 
[[Użytkownik:RobertJB|RobertJB]] ([[Dyskusja użytkownika:RobertJB|dyskusja]]) 15:42, 28 cze 2016 (CEST)
 
[[Użytkownik:RobertJB|RobertJB]] ([[Dyskusja użytkownika:RobertJB|dyskusja]]) 15:42, 28 cze 2016 (CEST)

Aktualna wersja na dzień 11:20, 10 maj 2023

Instrukcja warunkowa

Zasadniczo każdy program w Pythonie składa się z ciągu instrukcji, które są wykonywane w kolejności, w jakiej zostały zapisane. W programowaniu potrzebna jest jednak możliwość podejmowania decyzji o przyjęciu różnych kursów postępowania, w zależności od danych z jakimi mamy do czynienia. Umożliwiają to instrukcje złożone, a szczególnie - instrukcja warunkowa.

Instrukcja warunkowa to pierwszy przykład instrukcji złożonej. W najprostszej postaci składa się ona z ciągu (jednej lub więcej) instrukcji ujętych w blok, który jako całość będzie wykonany lub nie, w zależności od tego, czy spełniony jest pewien warunek - co zależy zazwyczaj od aktualnych wartości pewnych zmiennych. Warunek ten zapisuje się w postaci wyrażenia logicznego.

Wśród instrukcji tworzących blok warunkowy mogą oczywiście się pojawić również instrukcje złożone, nie tylko instrukcje proste. Na przykład, kolejne instrukcje warunkowe.

Przykład minimalny:

x1, x2 = None, None
if delta > 0 and not a == 0:
    x1 = (-b + delta) / 2 / a
    x2 = (-b - delta) / 2 / a
print(x1, x2)

Linijka z wywołaniem print nie jest już częścią instrukcji warunkowej, tylko kolejną instrukcją.

Do zapamiętania:

  • wiersz otwierający instrukcję złożoną (czyli tu: zaczynająca się od if) zawsze kończy się dwukropkiem
  • instrukcje tworzące blok w instrukcji złożonej są pisane z wcięciem, które musi być jednolite — oczywiście jeżeli częścią bloku jest kolejna instrukcja złożona, to dodaje ona swoje, kolejne wcięcie
  • koniec bloku rozpoznaje się po powrocie do uprzedniego poziomu wcięcia
  • blok instrukcji pod if ... nie może być pusty. Instrukcja if z pustym blokiem warunkowym jest nie tylko nieprzydatna, ale jest również błędem składniowym. Jeżeli (tymczasowo?) chcemy pozostawić instrukcję warunkową bez wnętrza, to możemy tam wpisać instrukcję pass — jest to instrukcja pusta (,,nie rób nic").

Przykład bardziej złożony:

if a == 0:
    print('Równanie nie jest kwadratowe.')
elif delta > 0 and not a == 0:
    x1 = (-b + delta) / 2 / a
    x2 = (-b - delta) / 2 / a
    print('Są dwa pierwiastki: x1 =', x1, 'x2 =', x2)
elif delta == 0:
    x = -b / 2 / a
    print('Jest tylko jeden pierwiastek: x =', x)
else: # delta < 0:
    print('Nie ma pierwiastków rzeczywistych.')

Jak to działa?

  • Jeżeli spełniony jest warunek a == 0, wykonany zostanie blok poniżej if ..., a reszta instrukcji zostanie pominięta;
  • Jeżeli warunek ten jest nieprawdziwy (i tylko wtedy), to sprawdzane są kolejno warunki umieszczone w wierszach zaczynających się od elif. Jeśli któryś z nich okaże się prawdziwy, to blok poniżej tej linijki zostanie wykonany, a cała reszta - pominięta;
  • Jeżeli żaden z warunków - tych po if, i tych po wszystkich elif - nie okazał się prawdziwy, wykonany zostanie blok związany z else.
  • Bloków elif może być w instrukcji dowolnie wiele (w tym - wcale), if jest obowiązkowy (inaczej nie byłoby instrukcji warunkowej) i tylko jeden, else może wystąpić wyłącznie na końcu - jeden raz, lub wcale.
  • Komentarz po else: jest podpowiedzią dla czytającego, że skoro już zbadano warunki delta == 0 oraz delta > 0, a wykonanie dotarło do tej linijki, to delta < 0 jest jedyną pozostałą możliwością (o ile możemy założyć, że delta jest na pewno liczbą!). Jest on przeznaczony wyłącznie dla ludzkich oczu - interpreter go zignoruje, jak każdy komentarz.

Mam nadzieję, że czytający już zauważył, że and not a == 0 w trzeciej linijce jest niepotrzebne. Dlaczego?

Wyrażenie warunkowe

Innym sposobem uzależnienia wyniku działania od jakiegoś warunku jest tzw. wyrażenie warunkowe. Jest ono szczególnie wygodne w prostych przypadkach, i pozwala zapisać pewne działania w bardziej zwięzły sposób.

Przykład: chcemy, aby z nazwą wbx wiązała się wartość bezwzględna (moduł) aktualnej wartości (liczby) x. Za pomocą instrukcji warunkowej można to zrealizować tak:

if x < 0:
    wbx = -x
else:
    wbx = x

Ten sam wynik można osiągnąć za pomocą wyrażenia warunkowego:

wbx = -x if x < 0 else x

W wyrażeniu warunkowym nie ma opcji uwzględnienia dodatkowych możliwości za pomocą elif.

Ćwiczenia

W programach ćwiczebnych nieraz przyda nam się funkcja input(). Działa ona w sposób następujący: argumentem wywołania powinien być jakiś napis (np. w postaci stałej napisowej): input('podaj jakąś liczbę całkowitą: '). Gdy w programie przyjdzie kolej na wykonanie takiego wywołania, program wypisze ten napis do terminalu i będzie oczekiwał na reakcję użytkownika, czyli wpisanie czegoś z klawiatury (i zakończenie naciśnięciem klawisza Enter). Gdy to nastąpi, wynikiem wywołania funkcji input w programie będzie treść wpisana prze użytkownika (bez końcowego znaku nowej linii).

Uwaga: wartość zwracana przez input() zawsze jest napisem, a nie liczbą - choćby się składał z samych cyfr.

1. Napisz program, którego uruchomienie ma następujący skutek:

  • program wita użytkownika (komunikatem w terminalu),
  • prosi o wprowadzenie liczby całkowitej,
  • sprawdza, czy liczba ta jest podzielna przez 7, i informuje o wyniku tego sprawdzenia

2. Napisz program, którego uruchomienie ma następujący skutek:

  • program prosi użytkownika o podanie swojego (lub czyjegoś) wieku w latach
  • jeśli wiek jest ujemny, odpowiada ,,Nieprawidłowy wiek"
  • jeśli wiek wynosi 0, odpowiada ,,niemowlę"
  • jeśli wiek jest poniżej 18, odpowiada ,,dziecko"
  • jeśli wiek jest pomiędzy 18 a 120 (włącznie), odpowiada ,,dorosły"
  • jeśli wiek przekracza 120, odpowiada ,,ludzie tyle nie żyją"


CDN


poprzednia | Strona główna | dalej


RobertJB (dyskusja) 15:42, 28 cze 2016 (CEST)