Kontrola przepływu

W programach, które widzieliśmy dotychczas, zawsze występowały ciągi wyrażeń, które Python wiernie odtwarzał w podanej kolejności. Co zrobić, gdy chcemy zmienić tę kolejność? Na przykład chcemy, żeby program podejmował decyzje i robił różne rzeczy, zależnie od sytuacji, jak na przykład wypisywał „Dzień dobry” albo „Dobry wieczór” zależnie od pory dnia.

Jak zapewne zgadłeś, uzyskuje się to poprzez używanie wyrażeń kontroli przepływu. W Pythonie są trzy takie wyrażenia: if, for oraz while.

Konstrukcja if

Konstrukcja if jest używana do sprawdzania warunków. Jeżeli warunek jest prawdziwy, uruchamiamy blok operacji (zwany blokiem if), w przeciwnym wypadku wywołujemy inny blok (zwany blokiem else). Sekcja else jest opcjonalna.

Przykład:

number = 23
guess = int(input('Enter an integer : '))

if guess == number:
    # Nowy blok zaczyna się tutaj
    print('Congratulations, you guessed it.')
    print('(but you do not win any prizes!)')
    # Nowy blok kończy się tutaj
elif guess < number:
    # Następny blok
    print('No, it is a little higher than that')
    # Możesz tu robić co zechcesz
else:
    print('No, it is a little lower than that')
    # musisz mieć guessed > number aby być tutaj

print('Done')
# Ostatnia instrukcja jest zawsze wykonywana
# po ukończeniu bloku if

Rezultat:

$ python if.py
Enter an integer : 50
No, it is a little lower than that
Done

$ python if.py
Enter an integer : 22
No, it is a little higher than that
Done

$ python if.py
Enter an integer : 23
Congratulations, you guessed it.
(but you do not win any prizes!)
Done

Jak to działa:

W tym programie użytkownik zgaduje liczbę, a jego strzał jest porównywany z wartością, którą podaliśmy. Ustawiamy zmienną liczba na dowolną liczbę całkowitą, powiedzmy 23. Następnie prosimy użytkownika o podanie jego strzału używając funkcji raw_input. Funkcje są częściami programu wielokrotnego użytku. Dowiemy się o nich więcej w następnym rozdziale.

Wpisujemy ciąg znaków do wbudowanej funkcji input, która wypisuje go na ekran i oczekuje na to, co wpisze użytkownik. Po wpisaniu czegoś i naciśnięciu klawisza kbd:[enter], funkcja input() zwraca to, co wpisaliśmy jako ciąg znaków. Przetwarzamy go na liczbę całkowita za pomocą int, a następnie zapisujemy w zmiennej guess. Właściwie int jest klasą, ale w tej chwili jedynie musisz wiedzieć, że dzięki niej mozesz zmienić ciąg znaków na liczbę całkowitą (zakładając, że ten ciąg jest liczbą całkowitą zapisaną jako tekst).

W kolejnym kroku porównujemy strzał użytkownika z wybrana przez nas liczbą. Jeżeli są równe, wypisujemy komunikat o sukcesie. Zauważ, że używamy wcięć, aby pokazać Pythonowi, co należy do którego bloku. Oto dlaczego wcięcia w Pythonie są tak ważne. Mam nadzieję, że podpisujesz się pod regułą „spójnych wcięć”?

Zauważ też dwukropek pod koniec linijki z funkcją if. Pokazujemy tutaj Pythonowi, że do tej funkcji odnosi się blok znajdujący się pod nią.

Później sprawdzamy, czy strzał jest mniejszy od naszej liczby. Jeżeli tak, to sugerujemy użytkownikowi, że powinien podać większą liczbę. Użyliśmy tutaj sekcji elif, która łączy dwa powiązane wyrażenia if else-if else w jedno połączone if elif else. To sprawia, że program jest łatwiejszy i redukuje ilość koniecznych wcięć.

Wyrażenia elif i else również muszą mieć na końcu swojej linijki dwukropek, a następnie własny blok poleceń (oczywiście z właściwymi wcięciami).

Możesz wstawić kolejne if w bloku if ile razy chcesz. To się nazywa zagnieżdżone if.

Pamiętaj, że sekcje elif oraz else nie są konieczne. Minimalnym prawidłowym wyrażeniem jest na przykład:

if True:
    print('Yes, it is true')

Gdy Python skończył pracę z blokiem if wraz z towarzyszącymi elif oraz else, przeszedł do kolejnego polecenia zawartego w tym samym bloku, co if. W naszym przykładzie, kolejnym poleceniem jest print('Done'). Po nim Python widzi koniec programu, więc kończy swoje działanie.

Mimo, ze to był bardzo prosty program, pokazałem mnóstwo rzeczy, które powinieneś zauważyć nawet w tym prostym programie. Wszystkie są bezpośrednie (oraz zaskakująco łatwe dla tych, którzy maja już zaplecze typu C/C++) i wymagają, abyś zawczasu zaczął na nie uważać, ale potem będziesz się czuł z nimi wygodnie i będą one dla ciebie naturalne.

Uwaga dla programujących w C/C++

W Pythonie nie istnieje wyrażenie switch. Możesz używać konstrukcji if...elif...else z tym samym skutkiem (a w niektórych przypadkach możesz użyć słownika, aby zrobić to szybciej).

Konstrukcja while

Konstrukcja while pozwala na kilkukrotne wywołanie bloku poleceń, tak długo, jak długo warunek będzie prawdziwy. Konstrukcja while jest przykładem tego, co nazywamy konstrukcją zapętloną. Konstrukcja while może posiadać dodatkowy blok else.

Przykład:

number = 23
running = True

while running:
    guess = int(input('Enter an integer : '))

    if guess == number:
        print('Congratulations, you guessed it.')
        # To sprawia, że pętla while przestaje działać.
        running = False
    elif guess < number:
        print('No, it is a little higher than that.')
    else:
        print('No, it is a little lower than that.')
else:
    print('The while loop is over.')
    # Możesz tu dołożyć, co zechcesz.

print('Done')

Rezultat:

$ python while.py
Enter an integer : 50
No, it is a little lower than that.
Enter an integer : 22
No, it is a little higher than that.
Enter an integer : 23
Congratulations, you guessed it.
The while loop is over.
Done

Jak to działa:

W tym programie nadal gramy w zgadywankę, ale zaleta jest taka, że użytkownik może dalej zgadywać, aż odgadnie odpowiedź — nie ma konieczności ponownego uruchamiania programu po każdym strzale, do czego byliśmy poprzednio zmuszeni. To trafnie przedstawia użycie konstrukcji while.

Przesunęliśmy wyrażenia input oraz if do wnętrza while i ustawiliśmy zmienną dzialaj na wartość True przed pętlą while. Najpierw sprawdzamy, czy zmienna dzialaj ma wartość True, a następnie przystępujemy do wykonywania bloku while. Po zakończeniu pracy tego bloku, warunek jest sprawdzany ponownie (w tym wypadku wartość zmiennej dzialaj). Jeżeli jest prawdziwy, pętla uruchamia się ponownie, w przeciwnym wypadku wywołujemy opcjonalny blok else i idziemy dalej.

Blok else jest wywoływany gdy warunek pętli while przyjmuje wartość False. To może się wydarzyć nawet za pierwszym razem, gdy warunek jest sprawdzany. Jeżeli istnieje sekcja else dla pętli while, jest ona zawsze uruchamiana, z wyjątkiem sytuacji, gdy wyjdziesz z pętli poleceniem break.

True oraz False zwane są typami boolowskimi (typy logiczne — przyp. tłum.) i możesz je uważać za równoważne wartościom odpowiednio 1 i 0.

Uwaga dla programujących w C/C++

Pamiętaj, że zawsze możesz użyć sekcji else przy pętli while.

Pętla for

Wyrażenie for...in jest kolejną pętlą, która iteruje według sekwencji obiektów, czyli przechodzi wzdłuż nich sekwencyjnie. Dowiemy się więcej o sekwencjach w dalszych rozdziałach. Na chwilę obecną musisz wiedzieć jedynie, ze sekwencja to uporządkowany zbiór elementów.

Przykład:

for i in range(1, 5):
    print(i)
else:
    print('The for loop is over')

Rezultat:

$ python for.py
1
2
3
4
The for loop is over

Jak to działa: W tym programie wypisujemy sekwencję liczb. Generujemy ją używając wbudowanej funkcji range.

Wpisujemy tu dwie liczby, a funkcja range zwraca nam sekwencję liczb zaczynając od pierwszej, a kończąc na poprzedniku drugiej. W tym przykładzie range(1, 5) tworzy sekwencję [1, 2, 3, 4]. Domyślnie, range liczy co 1. Jeżeli podamy trzecią liczbę, liczenie będzie się odbywać według niej. Na przykład range(1, 5, 2) zwróci [1, 3]. Pamiętaj, że range liczy do poprzednika drugiej liczby, czyli w wyniku ta druga liczba nie wystąpi.

Zauważ, że pętla range() generuje tylko jedną liczbę w danym momencie, jeśli chcesz całą listę musisz wywołać list() nad range(), na przykład, list(range(5)) co zwróci [0, 1, 2, 3, 4].

Następnie pętla for iteruje w tym zakresie — for i in range(1, 5) jest równoznaczne z for i in [1, 2, 3, 4], co działa jak przypisywanie każdej liczby (lub obiektu) zmiennej i, a następnie uruchamianie bloku wyrażeń dla każdej wartości i. W tym przypadku po prostu wypisujemy tę wartość na ekran.

Pamiętaj, że część else jest opcjonalna. Jeżeli istnieje, jest ona zawsze uruchamiana, z wyjątkiem sytuacji, gdy wyjdziesz z pętli poleceniem break.

Pamiętaj też, że pętla for...in działa na każdej sekwencji. Tutaj mieliśmy sekwencję liczb wygenerowaną przez wbudowaną funkcję range, ale tak naprawdę możemy użyć dowolnego rodzaju sekwencji z dowolnym rodzajem obiektów! Przyjrzymy się temu w następnych rozdziałach.

Uwaga dla programujących w C/C++/Java/C#

Pythonowa pętla for radykalnie różni się od pętli for w C/C++. Programujący w C# zauważą, że Pythonowa pętla for jest podobna do pętli foreach w C#. Programujący w Java zauważą, ze jest podobna do pętli for(int i : IntArray) w Java 1.5.

W C/C++ pisze się for(int i = 0; i < 5; i++), zaś w Pythonie jedynie for i in range(0,5). Jak widać, w Pythonie pętla for jest prostsza, bardziej ekspresywna i mniej podatna na błędy.

Wyrażenie break

Wyrażenia break używamy, aby wyrwać się z pętli, czyli zakończyć jej działanie, nawet jeżeli warunek pętli nie przyjął wartości False, lub iteracja się nie zakończyła.

Pamiętaj, że gdy wyjdziesz z pętli for albo while używając break, blok else nie zostanie wywołany.

Przykład:

while True:
    s = input('Enter something : ')
    if s == 'quit':
        break
    print('Length of the string is', len(s))
print('Done')

Rezultat:

$ python break.py
Enter something : Programming is fun
Length of the string is 18
Enter something : When the work is done
Length of the string is 21
Enter something : if you wanna make your work also fun:
Length of the string is 37
Enter something : use Python!
Length of the string is 11
Enter something : quit
Done

Jak to działa:

W tym programie wielokrotnie prosimy użytkownika o napisanie czegokolwiek i wypisujemy długość tego ciągu znaków na ekranie. Dodaliśmy specjalny warunek stopu poprzez sprawdzanie, czy użytkownik wpisał quit. Jeżeli tak, zatrzymujemy pętlę poleceniem break i wykonujemy końcową część programu.

Długość ciągu znaków sprawdzamy wbudowaną funkcją len.

Pamiętaj, że wyrażenie break może zostać w ten sam sposób użyte w pętli for.

Swaroop's Poetic Python

Tekst, który użyłem w tym przykładzie, to mały wierszyk, który napisałem. Nazywa się Swaroop's Poetic Python (po polsku Poetycki Python Swaroopa — przyp. tłum.).

Programming is fun
When the work is done
if you wanna make your work also fun:
    use Python!

Wyrażenie continue

Wyrażenia continue używamy, aby nakazać Pythonowi ominąć pozostałe wyrażenia w bloku pętli i kontynuować od następnej iteracji tej pętli.

Przykład:

while True:
    s = input('Enter something : ')
    if s == 'quit':
        break
    if len(s) < 3:
        print('Too small')
        continue
    print('Input is of sufficient length')
    # Możesz tu dołożyć co zechcesz

Rezultat:

$ python continue.py
Enter something : a
Too small
Enter something : 12
Too small
Enter something : abc
Input is of sufficient length
Enter something : quit

Jak to działa:

W tym programie prosimy użytkownika o wpis, ale zajmujemy się nim jedynie, gdy ma przynajmniej 3 znaki długości. W tym celu używamy wbudowanej funkcji len, aby poznać długość wpisu i jeżeli jest on krótszy niż 3 znaki, pomijamy resztę poleceń w bloku pętli wyrażeniem continue. W przeciwnym wypadku, wszystkie pozostałe procesy w bloku pętli zostają uruchomione i możemy zrobić wszystko, co chcemy.

Pamiętaj, że wyrażenie continue może zostać w ten sam sposób użyte w pętli for.

Podsumowanie

Zobaczyliśmy, jak używać trzech wyrażeń kontroli przepływu — if, while oraz for, razem z powiazanymi z nimi poleceniami break i continue. Są one jednymi z najczęściej używanych części Pythona i w związku z tym obeznanie się z nimi jest niezbędne.

W następnym rozdziale dowiemy się, jak tworzyć i operować funkcjami.

results matching ""

    No results matching ""