W poprzedniej części stanęliśmy przed zadaniem usunięcia niepotrzebnych fragmentów z książek. W książce „Kiwony” chcemy się pozbyć pojawiających się 3-gramów 'przypisek t d’ i 't d m’, ale nie ma sensu szukać takiego ciągu we wszystkich książkach. Użyjmy instrukcji warunkowej if. If to instrukcja która wykonuje zadanie, jeśli jest spełniony warunek. Przypomnijmy fragment kodu z części 11:
from os import listdir
sciezka = "F:\\python\\ids\\"
pliki = listdir(sciezka)
for plik in pliki:
print(sciezka + plik)
Tym razem zamiast drukować listę plików, wydrukujmy tylko ten, w którym znajduje się kłopotliwy tekst, czyli Kiwony – Tadeusz Dolega-Mostowicz.txt. Zmieńmy program:
from os import listdir
sciezka = "F:\\python\\ids\\"
pliki = listdir(sciezka)
for plik in pliki:
if plik == "Pamietnik pani Hanki - Tadeusz Dolega-Mostowicz.txt":
print("znalazłem plik do obróbki")
W 5 linijce zaczyna się pętla, która używa nazw plików z zmiennej pliki. W 6 linijce zaczyna się kolejna instrukcja warunkowa if. Wytłumaczmy, co tutaj się dzieje. If to słowo zaczynające instrukcję, mówiące „jeśli”, potem mamy plik, co w naszym przypadku jest nazwą pliku, potem mamy ==, co oznacza „jest równe”. Jak wiesz pojedynczy znak równości służy podstawianiu wartości pod zmienne, podwójny natomiast służy powiedzeniu, że coś jest równe. Jak do tej pory nasza instrukcja mówi „jeśli nazwa pliku jest równa”. To co znajduje się po == jest po prostu nazwą pliku, którego szukamy, na końcu linijki pojawia się : informujący, że to koniec warunku, który w całości brzmi „Jeśli nazwa pliku jest równa Pamietnik pani Hanki – Tadeusz Dolega-Mostowicz.txt to”. 7 linijka zaczyna się od kolejnego wcięcia, jak to zawsze po dwukropku, wszystkie nasze polecenia dotyczące tej instrukcji muszą być wcięte. W przykładzie jest tylko jedno polecenie, wydrukuj tekst potwierdzający, że plik został znaleziony. Zobaczmy działanie:
======================== RESTART: F:/python38/wpis 12.py =======================
znalazłem plik do obróbki
>>>
Wygląda na to, że działa, ale zawsze warto upewnić się, co stanie się w przypadku podania tytułu, którego nie ma w folderze:
from os import listdir
sciezka = "F:\\python\\ids\\"
pliki = listdir(sciezka)
for plik in pliki:
if plik == "Elementarz.txt":
print("znalazłem plik do obróbki")
I zobaczmy efekt:
======================== RESTART: F:/python38/wpis 12.py =======================
>>>
Nie ma takiego pliku, nie ma czego wydrukować.
Instrukcja warunkowa if występuje często z dwoma kolejnymi wariacjami else i elif. Zacznijmy od przykładu z else:
from os import listdir
sciezka = "F:\\python\\ids\\"
pliki = listdir(sciezka)
for plik in pliki:
if plik == "Pamietnik pani Hanki - Tadeusz Dolega-Mostowicz.txt":
print("znalazłem plik do obróbki")
else:
print("to nie ten plik")
W 8 linijce pojawia się wspomniane else, else używane jest po if i ewnetulanie po elif. Else oznacza „w innym przypadku” i też towarzyszy mu dwukropek, gdzie po dwukropku, w nowej linijce, po wcięciu, zapisujemy co powinno się wydarzyć. Zauważ, że else jest na tej samej „głębokości” co if. If i else w tym wypadku mówi nam, że „Jeśli nazwa pliku jest równa Pamietnik pani Hanki – Tadeusz Dolega-Mostowicz.txt wydrukuj znalazłem plik do obróbki, w innym przypadku wydrukuj to nie ten plik. Sprawdźmy działanie:
======================== RESTART: F:\python38\wpis 12.py =======================
to nie ten plik
to nie ten plik
to nie ten plik
to nie ten plik
to nie ten plik
to nie ten plik
to nie ten plik
to nie ten plik
to nie ten plik
to nie ten plik
to nie ten plik
znalazłem plik do obróbki
>>>
Działa, ale uładnijmy nieco efekt:
from os import listdir
sciezka = "F:\\python\\ids\\"
pliki = listdir(sciezka)
for plik in pliki:
if plik == "Pamietnik pani Hanki - Tadeusz Dolega-Mostowicz.txt":
print(f"usuń (Przypisek T. D. M.): {plik}")
else:
print(f"to nie ten plik: {plik}")
Zobaczmy teraz:
======================== RESTART: F:\python38\wpis 12.py =======================
to nie ten plik: Bankructwo malego Dzeka - Janusz Korczak.txt
to nie ten plik: Bracia Dalcz i S-ka - Tadeusz Dolega-Mostowicz.txt
to nie ten plik: Dr. Murek zredukowany - Tadeusz Dolega-Mostowicz.txt
to nie ten plik: Drugie zycie doktora Murka - Tadeusz Dolega-Mostowicz.txt
to nie ten plik: Dzieci ulicy - Janusz Korczak.txt
to nie ten plik: Dziecko salonu - Janusz Korczak.txt
to nie ten plik: Kajtus Czarodziej - Janusz Korczak.txt
to nie ten plik: Kariera Nikodema Dyzmy - Tadeusz Dolega-Mostowicz.txt
to nie ten plik: Kiedy znow bede maly - Janusz Korczak.txt
to nie ten plik: Kiwony - Tadeusz Dolega-Mostowicz.txt
to nie ten plik: Krol Macius na wyspie bezludnej - Janusz Korczak.txt
usuń (Przypisek T. D. M.): Pamietnik pani Hanki - Tadeusz Dolega-Mostowicz.txt
>>>
W naszym przykładzie potrzebujemy więcej niż jednego warunku if. Jeszcze chcemy wprowadzić zmiany w plikach z przypisami, czyli: „Dziecko salonu – Janusz Korczak.txt”, „Kiedy znow bede maly – Janusz Korczak.txt” i „Bankructwo malego Dzeka – Janusz Korczak.txt”. Do tego wykorzystamy elif, czyli „albo jeśli”. Zasada działania jest taka sama jak przy else, czyli towarzyszy mu dwukropek, gdzie po dwukropku, w nowej linijce, po wcięciu, zapisujemy co powinno się wydarzyć. Elif jest używane po if i przed else. Dodajmy nasze warunki:
from os import listdir
sciezka = "F:\\python\\ids\\"
pliki = listdir(sciezka)
for plik in pliki:
if plik == "Pamietnik pani Hanki - Tadeusz Dolega-Mostowicz.txt":
print(f"Usuń (Przypisek T. D. M.): {plik}")
elif plik == "Dziecko salonu - Janusz Korczak.txt":
print(f"Usuń przypisy: {plik}")
elif plik == "Kiedy znow bede maly - Janusz Korczak.txt":
print(f"Usuń przypisy: {plik}")
elif plik == "Bankructwo malego Dzeka - Janusz Korczak.txt":
print(f"Usuń przypisy: {plik}")
else:
print(f"to nie ten plik: {plik}")
Do naszego programu dodaliśmy trzy warunku elif. Zobaczmy efekt:
======================== RESTART: F:\python38\wpis 12.py =======================
Usuń przypisy: Bankructwo malego Dzeka - Janusz Korczak.txt
to nie ten plik: Bracia Dalcz i S-ka - Tadeusz Dolega-Mostowicz.txt
to nie ten plik: Dr. Murek zredukowany - Tadeusz Dolega-Mostowicz.txt
to nie ten plik: Drugie zycie doktora Murka - Tadeusz Dolega-Mostowicz.txt
to nie ten plik: Dzieci ulicy - Janusz Korczak.txt
Usuń przypisy: Dziecko salonu - Janusz Korczak.txt
to nie ten plik: Kajtus Czarodziej - Janusz Korczak.txt
to nie ten plik: Kariera Nikodema Dyzmy - Tadeusz Dolega-Mostowicz.txt
Usuń przypisy: Kiedy znow bede maly - Janusz Korczak.txt
to nie ten plik: Kiwony - Tadeusz Dolega-Mostowicz.txt
to nie ten plik: Krol Macius na wyspie bezludnej - Janusz Korczak.txt
Usuń (Przypisek T. D. M.): Pamietnik pani Hanki - Tadeusz Dolega-Mostowicz.txt
>>>
Program działa poprawnie, ale podaliśmy trzy warunki elif i każdy z nich robi dokładnie to samo: print(f"Usuń przypisy: {plik}"). Uprościmy tą sytuację stosując wyrażenie logiczne or. Or oznacza „lub”. Popatrz na nowy kod:
from os import listdir
sciezka = "F:\\python\\ids\\"
pliki = listdir(sciezka)
for plik in pliki:
if plik == "Pamietnik pani Hanki - Tadeusz Dolega-Mostowicz.txt":
print(f"Usuń (Przypisek T. D. M.): {plik}")
elif plik == "Dziecko salonu - Janusz Korczak.txt" or \
plik == "Kiedy znow bede maly - Janusz Korczak.txt" or \
plik == "Bankructwo malego Dzeka - Janusz Korczak.txt":
print(f"Usuń przypisy: {plik}")
else:
print(f"to nie ten plik: {plik}")
W linijkach 8-10 mamy jeden warunek elif, który mówi że „albo jeśli – nazwa pliku jest równa Dziecko salonu – Janusz Korczak.txt, albo nazwa pliku jest równa Kiedy znow bede maly – Janusz Korczak.txt, albo nazwa pliku jest równa Bankructwo malego Dzeka – Janusz Korczak.txt, wydrukuj print(f"Usuń przypisy: {plik}"). Teraz kod programu jest bardziej czytelny i dodatkowo zaoszczędziliśmy 2 linijki. Sprawdźmy działanie:
======================== RESTART: F:\python38\wpis 12.py =======================
Usuń przypisy: Bankructwo malego Dzeka - Janusz Korczak.txt
to nie ten plik: Bracia Dalcz i S-ka - Tadeusz Dolega-Mostowicz.txt
to nie ten plik: Dr. Murek zredukowany - Tadeusz Dolega-Mostowicz.txt
to nie ten plik: Drugie zycie doktora Murka - Tadeusz Dolega-Mostowicz.txt
to nie ten plik: Dzieci ulicy - Janusz Korczak.txt
Usuń przypisy: Dziecko salonu - Janusz Korczak.txt
to nie ten plik: Kajtus Czarodziej - Janusz Korczak.txt
to nie ten plik: Kariera Nikodema Dyzmy - Tadeusz Dolega-Mostowicz.txt
Usuń przypisy: Kiedy znow bede maly - Janusz Korczak.txt
to nie ten plik: Kiwony - Tadeusz Dolega-Mostowicz.txt
to nie ten plik: Krol Macius na wyspie bezludnej - Janusz Korczak.txt
Usuń (Przypisek T. D. M.): Pamietnik pani Hanki - Tadeusz Dolega-Mostowicz.txt
>>>
Działa! Pamiętaj, że instrukcja warunkowa if, elif, else sprawdza warunki od góry do dołu, jeśli znajdzie element, który spełnia warunek NIE SPRAWDZA kolejnych warunków. Popatrz na taki przykład:
from os import listdir
sciezka = "F:\\python\\ids\\"
pliki = listdir(sciezka)
for plik in pliki:
if plik.endswith(".txt"):
print(f"Usuń (Przypisek T. D. M.): {plik}")
elif plik == "Dziecko salonu - Janusz Korczak.txt" or \
plik == "Kiedy znow bede maly - Janusz Korczak.txt" or \
plik == "Bankructwo malego Dzeka - Janusz Korczak.txt":
print(f"Usuń przypisy: {plik}")
else:
print(f"to nie ten plik: {plik}")
w 7 linijce za pomocą metody .endswith() stawiamy warunek „jeżeli zmienna plik kończy się ciągiem znaków .txt”, to:. Potem mamy kolejne warunki, zobaczmy efekt działania:
======================== RESTART: F:\python38\wpis 12.py =======================
Usuń (Przypisek T. D. M.): Bankructwo malego Dzeka - Janusz Korczak.txt
Usuń (Przypisek T. D. M.): Bracia Dalcz i S-ka - Tadeusz Dolega-Mostowicz.txt
Usuń (Przypisek T. D. M.): Dr. Murek zredukowany - Tadeusz Dolega-Mostowicz.txt
Usuń (Przypisek T. D. M.): Drugie zycie doktora Murka - Tadeusz Dolega-Mostowicz.txt
Usuń (Przypisek T. D. M.): Dzieci ulicy - Janusz Korczak.txt
Usuń (Przypisek T. D. M.): Dziecko salonu - Janusz Korczak.txt
Usuń (Przypisek T. D. M.): Kajtus Czarodziej - Janusz Korczak.txt
Usuń (Przypisek T. D. M.): Kariera Nikodema Dyzmy - Tadeusz Dolega-Mostowicz.txt
Usuń (Przypisek T. D. M.): Kiedy znow bede maly - Janusz Korczak.txt
Usuń (Przypisek T. D. M.): Kiwony - Tadeusz Dolega-Mostowicz.txt
Usuń (Przypisek T. D. M.): Krol Macius na wyspie bezludnej - Janusz Korczak.txt
Usuń (Przypisek T. D. M.): Pamietnik pani Hanki - Tadeusz Dolega-Mostowicz.txt
>>>
Nasz program sprawdził, czy jest spełniony warunek zapisany w 7 linijce i już kolejnych nie sprawdzał. Pamiętaj o tym przy tworzeniu instrukcji if!
Zadanie domowe
Podążanie za instrukcjami, nawet jeśli je wszystkie wykonujesz samodzielnie, nie zrobi z ciebie programisty. Zadania domowe mogą wydawać się na początku trudne. Tu nie ma rozwiązania podanego na talerzu, użyj dowolnych źródeł, by znaleźć odpowiedź.
- Napisz program, który generuje liczby od 1 do 5 i sprawdza ich parzystość, efekt powinien być zbliżony do takiego:
1 jest nieparzysta
2 jest parzysta
3 jest nieparzysta
4 jest parzysta
5 jest nieparzysta
>>>
- Dodaj warunek pozwalający osiągnąć taki efekt:
1 jest nieparzysta
2 jest parzysta
3 jest nieparzysta
4 jest jedyną podzielną przez cztery
5 jest nieparzysta
6 jest parzysta
7 jest nieparzysta
>>>