1.1. Mały Lotek

W Toto Lotku trzeba zgadywać liczby. Napiszmy prosty program, w którym będziemy mieli podobne zadanie. Użyjemy języka Python.

1.1.1. Szablon

Zaczynamy od utworzenia pliku o nazwie toto.py w dowolnym katalogu za pomocą dowolnego edytora. Zapis ~$ poniżej oznacza katalog domowy użytkownika. Obowiązkowa zawartość pliku:

Kod nr
1
2
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

Pierwsza linia to ścieżka do interpretera Pythona (zob. interpreter), druga linia deklaruje sposób kodowania znaków, dzięki czemu możemy używać polskich znaków.

1.1.2. Wartości i zmienne

Zaczniemy od wylosowania jednej liczby. Potrzebujemy funkcji randint(a, b) z modułu random. Zwróci nam ona liczbę całkowitą z zakresu <a; b>. Do naszego pliku dopisujemy:

Kod nr
4
5
6
7
import random

liczba = random.randint(1, 10)
print("Wylosowana liczba:", liczba)

Wylosowana liczba zostanie zapamiętana w zmiennej liczba (zob. zmienna ). Funkcja print() wydrukuje ją razem z komunikatem na ekranie. Program możemy już uruchomić w terminalu (zob. terminal), wydając w katalogu z plikiem polecenie:

~$ python3 toto.py

Efekt działania naszego skryptu:

../../_images/toto02.png

Wskazówka

Skrypty Pythona możemy też uruchamiać z poziomu edytora, o ile oferuje on taką możliwość.

1.1.3. Wejście – wyjście

Liczbę mamy, niech gracz, czyli użytkownik ją zgadnie. Pytanie tylko, na ile prób mu pozwolimy. Zacznijmy od jednej! Dopisujemy zatem:

Kod nr
1
2
3
4
5
6
7
8
9
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import random

liczba = random.randint(1, 10)
print("Wylosowana liczba:", liczba)

odp = input("Jaką liczbę od 1 do 10 mam na myśli? ")

Liczbę podaną przez użytkownika pobieramy za pomocą funkcji input() i zapamiętujemy w zmiennej odp.

Uwaga

Zakładamy na razie, że gracz wprowadza poprawne dane, czyli liczby całkowite!

1.1.3.1. Ćwiczenie 1

  • Zgadywanie, gdy losowana liczba jest drukowana, nie jest zabawne. Zakomentuj więc instrukcję drukowania: # print("Wylosowana liczba:", liczba) – będzie pomijana przez interpreter.
  • Dopisz odpowiednie polecenie, które wyświetli liczbę podaną przez gracza. Przetestuj jego działanie.
../../_images/toto03.png

1.1.4. Instrukcja warunkowa

Mamy wylosowaną liczbę i typ gracza, musimy sprawdzić, czy trafił. Uzupełniamy nasz program:

Kod nr
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import random

liczba = random.randint(1, 10)
# print("Wylosowana liczba:", liczba)

odp = input("Jaką liczbę od 1 do 10 mam na myśli? ")
# print("Podałeś liczbę: ", odp)

if liczba == int(odp):
    print("Zgadłeś! Dostajesz długopis!")
else:
    print("Nie zgadłeś. Spróbuj jeszcze raz.")

Używamy instrukcji warunkowej if, która sprawdza prawdziwość warunku liczba == int(odp) (zob. instrukcja warunkowa). Jeżeli wylosowana i podana liczba są sobie równe (==), wyświetlamy informację o wygranej, w przeciwnym razie (else:) zachętę do ponownej próby.

Informacja

Instrukcja input() wszystkie pobrane dane zwraca jako napisy (typ string). Do przekształcenia napisu na liczbę całkowitą (typ integer) wykorzystujemy funkcję int(), która w przypadku niepowodzenia zgłasza wyjątek ValueError. Obsługę wyjątków omówimy później.

Przetestuj kilkukrotnie działanie programu.

../../_images/toto04.png

1.1.5. Pętla for

Trafienie za pierwszym razem wylosowanej liczby jest bardzo trudne, damy graczowi 3 szanse. Zmieniamy i uzupełniamy kod:

Kod nr
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import random

liczba = random.randint(1, 10)
# print("Wylosowana liczba:", liczba)

for i in range(3):
    odp = input("Jaką liczbę od 1 do 10 mam na myśli? ")
    # print("Podałeś liczbę: ", odp)

    if liczba == int(odp):
        print("Zgadłeś! Dostajesz długopis!")
        break
    else:
        print("Nie zgadłeś. Spróbuj jeszcze raz.")
        print()

Pobieranie i sprawdzanie kolejnych liczb wymaga powtórzeń, czyli pętli (zob. pętla). Blok powtarzających się operacji umieszczamy więc w instrukcji for. Ilość powtórzeń określa wyrażenie i in range(3). Zmienna iteracyjna i to “licznik” powtórzeń. Przyjmuje on kolejne wartości wygenerowane przez konstruktor range(n). Funkcja ta tworzy sekwencję liczb całkowitych od 0 do n-1.

A więc polecenia naszego skryptu, które umieściliśmy w pętli, wykonają się 3 razy, chyba że... użytkownik trafi za 1 lub 2 razem. Wtedy warunek w instrukcji if stanie się prawdziwy, wyświetli się informacja o nagrodzie, a polecenie break przerwie działanie pętli.

Uwaga

Uwaga na WCIĘCIA!

Podporządkowane bloki kodu wyodrębniamy za pomocą wcięć (zob. formatowanie kodu). Standardem są 4 spacje i ich wielokrotności. Przyjęty rozmiar wcięć obowiązuje w całym pliku. Błędy wcięć sygnalizowane są komunikatem IndentationError.

W naszym kodzie linie 10, 13, 16 wcięte są na 4 spacje, zaś 14-15, 17-18 na 8.

1.1.5.1. Ćwiczenia

Sprawdźmy działanie konstruktora range() w trybie interaktywnym interpretera Pythona. W terminalu wpisz polecenia:

~$ python3
>>> list(range(30))
>>> for i in range(0, 100, 2)
...   print i
...
>>> exit()

Funkcja range() może przyjmować opcjonalne parametry określające początek, koniec oraz krok generowanej listy wartości.

Uzupełnij kod naszego programu, tak aby wyświetlane były komunikaty: “Próba 1”, “Próba 2” itd. przed podaniem liczby.

1.1.6. Instrukcja if...elif

Po 3 błędnej próbie program ponownie wyświetla komunikat: “Nie zgadłeś...” Za pomocą członu elif możemy wychwycić ten przypadek i właściwie go obsłużyć. Kod przyjmie następującą postać:

Kod nr
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import random

liczba = random.randint(1, 10)
# print("Wylosowana liczba:", liczba)

for i in range(3):
    print("Próba ", i + 1)
    odp = input("Jaką liczbę od 1 do 10 mam na myśli? ")
    # print("Podałeś liczbę: ", odp)

    if liczba == int(odp):
        print("Zgadłeś! Dostajesz długopis!")
        break
    elif i == 2:
        print("Miałem na myśli liczbę: ", liczba)
    else:
        print("Nie zgadłeś. Spróbuj jeszcze raz.")
    print()

Ostateczny wynik działania naszego programu prezentuje się tak:

../../_images/toto07.png

1.1.7. Materiały

Źródła:


Licencja Creative Commons Materiały Python 101 udostępniane przez Centrum Edukacji Obywatelskiej na licencji Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 Międzynarodowa.

Utworzony:2017-11-17 o 06:13 w Sphinx 1.5.3
Autorzy:Patrz plik “Autorzy”