Python - podręcznik
Niniejszy podręcznik stanowi element innowacji społecznej HEAR_IT, która powstała w ramach Inkubatora Włączenia Społecznego. Chcesz dowiedzieć się więcej i poznać podstawy programowania? Wejdź na stronę: www.hearit.pl
Niniejszy podręcznik stanowi element innowacji społecznej HEAR_IT, która powstała w ramach Inkubatora Włączenia Społecznego.
Chcesz dowiedzieć się więcej i poznać podstawy programowania?
Wejdź na stronę: www.hearit.pl
- TAGS
- python
- programowanie
- komputer
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
podręcznik hearIT
PYTHON
niech kod będzie z Tobą!
Wydawca: Bartosz Kosiński – Far Beyond Business
Licencja: Creative Commons BY-SA
ISBN: 978-83-63278-73-1
Autorka: Kamila Chęcińska
Redaktor: Bartosz Kosiński
Opracowanie graficzne, skład i korekta: Piotr Kulig
HEAR_IT: www.hearit.pl
Niniejsza publikacja stanowi część innowacji społecznej HEAR_
IT opracowanej przez Stowarzyszenie Edukacji Pozaformalnej
„Meritum”.
Innowacja uzyskała wsparcie finansowe w ramach projektu Inkubator
Włączenia Społecznego, który realizowany jest przez
Regionalny Ośrodek Polityki Społecznej w Krakowie, Fundację
Rozwoju Demokracji Lokalnej im. Jerzego Regulskiego oraz
Uniwersytet Jagielloński w Krakowie.
Projekt wdrażany w ramach IV Osi Priorytetowej Programu
Operacyjnego Wiedza Edukacja Rozwój (Działanie 4.1: Innowacje
społeczne), na zlecenie Ministerstwa Rozwoju, finansowany
jest ze środków Unii Europejskiej w ramach Europejskiego Funduszu
Społecznego. Projekt jest realizowany od 1 października
2020 r. do 30 września 2023 r. w całej Polsce. Wartość projektu
wynosi 5 855 993,00 zł.
Żywa pagina
Podręcznik hearIT – Python
Wprowadzenie 6
Komputer i program komputerowy 6
Programowanie 8
Środowisko programistyczne 10
Algorytmy 12
Zmienne 20
Instrukcje wejścia/wyjścia 26
Listy i krotki 30
Instrukcje warunkowe 37
Pętle w języku Python 42
Pętla for 42
Obliczenia w pętli 46
Pętla while 48
Funkcje 51
Przykładowy projekt 59
Podsumowanie 79
4
Powrót do spisu treści
Żywa pagina
5
Powrót do spisu treści
Wprowadzenie
Komputer i program komputerowy
Codzienne używanie urządzeń elektronicznych jest dla nas
zupełnie naturalne. Korzystamy z radia, telewizji, smartfonów,
laptopów i wielu innych sprzętów. Większość z nich składa się
z obudowy i ukrytych w środku układów elektronicznych. Te
elementy elektroniczne to między innymi rezystory, kondensatory,
tranzystory i procesory. Osoba, która obsługuje urządzenie
elektroniczne, nie musi znać tych nazw. Budowa typowego
komputera jest na tyle skomplikowana, że tylko niewielu specjalistów
umie dokładnie powiedzieć, który element do czego
służy. Ale skoro obsługujesz komputer, to tak naprawdę zmuszasz
jego układy elektroniczne do działania. Więc może jeszcze
o tym nie wiesz, ale już trochę programujesz i trochę jesteś
programistą!
6
Powrót do spisu treści
Wprowadzenie
Komputer osobisty to laptop lub komputer stacjonarny. Laptop
ma baterię i można go używać w podróży. Komputer stacjonarny
ma monitor i jest na stałe podłączony do prądu. Mimo tych
różnic, każdy komputer osobisty działa bardzo podobnie. Można
na nim czytać, przeglądać internet, oglądać filmy, słuchać
muzyki. Można też tworzyć: pisać, publikować w internecie,
montować filmy i nagrywać muzykę. Ale sam komputer – jako
obudowa i układy elektroniczne – nie poradziłby sobie z tymi
zadaniami. Potrzebne są też programy komputerowe. Taki podstawowy
program służący do obsługi pozostałych programów
nazywa się systemem operacyjnym. W komputerach osobistych
stosuje się przede wszystkim systemy operacyjne Windows,
macOS i Linux. Każdy z nich ma wiele wersji i może różnie
wyglądać. Ale mają one bardzo ważną wspólną cechę: służą do
podstawowej obsługi komputera i dają możliwość uruchamiania
aplikacji, czyli programów. Część programów dostępna jest
od razu z systemem operacyjnym, na przykład kalkulator. Inne
trzeba dodatkowo zainstalować i służą konkretnym celom, na
przykład Google Chrome to przeglądarka internetu.
Wiesz już, że skoro zmuszasz komputer do działania, to w pewnym
sensie jesteś programistą. Żeby stać się programistą
w pełnym tego słowa znaczeniu, musisz napisać swój własny
program komputerowy. Jak to zrobić? Okazuje się, że to bardzo
proste. Programy dla komputerów osobistych z systemami
7
Powrót do spisu treści
Wprowadzenie
operacyjnymi Windows, macOS i Linux można napisać na przykład
za pomocą języka programowania Python. I o tym właśnie
jest ten podręcznik.
Programowanie
Programowanie to tworzenie programów komputerowych.
Użytkownik widzi gotowy program komputerowy, na przykład
kalkulator w komputerze. Kalkulator wymaga, żeby podać mu
dwie liczby i działanie, jakie ma wykonać. Dla uproszczenia
przyjmijmy, że nasz kalkulator tylko dodaje liczby. W takiej sytuacji,
gdy użytkownik poda liczby 2 i 3, to kalkulator da wynik
5. Ale skąd komputer wie, co ma zrobić z liczbami? Do tego
potrzebny jest program komputerowy o nazwie Kalkulator. Taki
program składa się z wielu linijek znaków, które w całości nazywamy
kodem źródłowym programu. Fragment kodu przykładowego
kalkulatora wygląda następująco:
liczba1 = int(input(“Podaj pierwszą liczbę”))
liczba2 = int(input(“Podaj drugą liczbę”))
print(liczba1 + liczba2)
Powyższy fragment kodu napisano w języku programowania
Python. Są różne języki programowania, najpopularniejsze
z nich to: C, Java, Python, C++, C#, Visual Basic, JavaScript,
PHP, R, Groovy, Asembler, SQL, Swift, Go, Ruby, Matlab, Perl,
8
Powrót do spisu treści
Wprowadzenie
Objective-C, Delphi, Classic Visual Basic. Jest ich dużo więcej,
podobnie jak języków, w których komunikują się ludzie.
Języki programowania służą komunikacji pomiędzy człowiekiem
a komputerem, a dokładnie do wydawania komputerowi
poleceń.
Języki programowania różnią się między innymi poziomem
tego, jak bardzo są zrozumiałe dla komputera, a jak bardzo
dla człowieka. Python jest przykładem języka wysokiego poziomu,
czyli łatwego do zrozumienia dla człowieka. W poniższym
przykładzie znajdują się wyłącznie słowa wymyślone
przez programistę i komendy w języku angielskim. Programista
wymyślił słowa i zdania: liczba1, liczba2, „Podaj pierwszą
liczbę”, „Podaj drugą liczbę”. Int to skrót od integer (liczba
całkowita), input (wejście) oznacza pobranie danych od
użytkownika, print (wydrukować) to polecenie, które służyło
wydrukowaniu wyniku, gdy jeszcze nie było monitorów,
a dziś służy do wyświetlania na ekranie. Te i kolejne polecenia
zostaną omówione w następnych rozdziałach podręcznika.
Żeby komputer zrozumiał kod napisany w języku Python,
kod ten trzeba dodatkowo przetłumaczyć (skompilować).
Kompilacja to proces przekształcania kodu zapisanego
przez programistę na kod zrozumiały dla komputera. Językiem
skrajnie niskiego poziomu jest kod maszynowy. Jest to
9
Powrót do spisu treści
Wprowadzenie
język programowania w pełni zrozumiały dla komputera, ale
bardzo trudny do zrozumienia dla człowieka. Przykładowy
fragment kodu maszynowego wygląda tak:
000000 00001 00010 00110 00000 100000
Dzieje się tak, ponieważ pamięć komputera składa się z ogromnej
liczby jednostek zwanych bitami. Bit może mieć tylko dwie
wartości: 0 lub 1. 0 oznacza się też jako FALSE (fałsz), a 1 jako
TRUE (prawda). Dla komputera odpowiedź na pytanie „Czy
pada deszcz?” można zapisać w postaci jednego bitu: 0 – nie
pada; 1 – pada.
Środowisko programistyczne
Sam kod programu można zapisać nawet na kartce papieru,
ale byłoby to bardzo niewygodne. Najlepsze miejsca na pisanie
kodu w Pythonie to takie, gdzie od razu można wypróbować
działanie programu, który piszemy. Żeby komputer mógł zrozumieć
polecenia w języku Python, konieczne jest skorzystanie
z odpowiedniego środowiska programistycznego. Dobrym rozwiązaniem
na początek nauki programowania w Pythonie jest
zainstalowanie pakietu Anaconda Individual Edition ze strony:
https://www.anaconda.com/products/individual
Po zakończeniu instalacji uruchamiamy program Jupyter, który
służy do pisania kodu przyszłego programu.
10
Powrót do spisu treści
Wprowadzenie
Napisany kod programu jest kompilowany i uruchamiany przy
pomocy przycisku Run. Kod można zapisać korzystając z symbolu
dyskietki w lewym górnym rogu menu.
Jeżeli potrzebujemy szybko wypróbować prosty fragment
kodu, możemy też skorzystać z jednego z wielu środowisk programistycznych
dostępnych online, na przykład:
https://www.programiz.com/python-programming/online-compiler/
11
Powrót do spisu treści
Algorytmy
Kod programu komputerowego jest zapisem algorytmu. Algorytm
to schemat postępowania, czyli zestaw instrukcji. Nie jest
to temat tego podręcznika, dlatego omówimy tylko, do czego
wykorzystujemy algorytmy w programowaniu i jak są zbudowane.
Algorytm może być przedstawiony na różne sposoby. Jednym
z nich jest schemat blokowy. Jakie bloki możemy wyróżnić?
wprowadzanie/
wyprowadzanie
danych
12
Powrót do spisu treści
Algorytmy
wykonywanie działań
13
Powrót do spisu treści
Algorytmy
Przykładem algorytmu z życia codziennego jest przepis kulinarny.
Bardzo prosty algorytm ilustrujący przepis na spaghetti
wygląda następująco:
Ugotuj makaron
NIE
Czy chcesz
danie mięsne?
TAK
Dodaj mięso
Dodaj warzywa
STOP
14
Powrót do spisu treści
Algorytmy
Podobnie projektuje się program komputerowy. Program komputerowy
jest zestawem poleceń (instrukcji) dla komputera.
W naszym przykładzie poleceniami były formuły: „Ugotuj makaron”,
„Dodaj mięso”, „Dodaj warzywa”. Komputer zamiast
tego może wykonać obliczenie, wyświetlić tekst na ekranie,
skopiować dane, wydać dźwięk, itd. W naszym algorytmie pojawiło
się pytanie „Czy chcesz danie mięsne?”. W takiej sytuacji
odpowiedź zmienia sposób realizacji przepisu na spaghetti –
powstanie danie mięsne lub bezmięsne. W kodzie programu
byłaby to instrukcja warunkowa, której działanie byłoby zależne
od odpowiedzi użytkownika. Na przykład kalkulator zapytałby,
czy użytkownik chce, żeby dodać do siebie liczby, czy
żeby odjąć od siebie liczby. Przed napisaniem programu w języku
Python warto narysować sobie podobny schemat, żeby
wiedzieć, co chcemy osiągnąć. Spróbujmy zatem to zrobić. Zaczynamy
oczywiście od bloku „Start” i wprowadzenia dwóch
liczb od użytkownika. Liczby te przechowamy w tak zwanych
zmiennych. O nich porozmawiamy sobie w dalszej części podręcznika.
Na potrzeby tego zadania załóżmy, że są to takie
miejsca do przechowania liczb.
15
Powrót do spisu treści
Algorytmy
Podaj pierwszą liczbę,
liczba1
Podaj pierwszą liczbę,
liczba2
Zwróćmy uwagę, że bloki połączone są za pomocą strzałki.
To ona wytycza kierunek realizacji algorytmu. Kolejnym krokiem
byłoby zsumowanie wartości. Do tego posłuży nam blok
operacji.
Podaj pierwszą liczbę,
liczba1
Podaj pierwszą liczbę,
liczba2
suma:= liczba1+liczba2
16
Powrót do spisu treści
Algorytmy
Wynik dodawania został przechowany w nowo utworzonej
zmiennej suma. Pora zakończyć algorytm.
Podaj pierwszą liczbę,
liczba1
Podaj pierwszą liczbę,
liczba2
suma:= liczba1+liczba2
STOP
Co by było, gdybyśmy chcieli wykonać dzielenie? algorytm wyglądałby
bardzo podobnie, ale musielibyśmy zabezpieczyć się
przed dużym błędem, jakim jest dzielenie przez 0. Zobaczmy,
jakby to wyglądało w naszym algorytmie.
17
Powrót do spisu treści
Algorytmy
Podaj pierwszą liczbę,
liczba1
Podaj pierwszą liczbę,
liczba2
TAK
liczba2 == 0?
NIE
Nie można dzielić
przez zero!
suma:= liczba1+liczba2
STOP
18
Powrót do spisu treści
Algorytmy
Dodatkowo dołożyliśmy blok warunkowy, który sprawdza, czy
wartość znajdująca się pod zmienną liczba2 jest różna od 0.
Jeżeli tak, to wyświetla się komunikat, że nie można wykonać
tego działania (jest to lewa odnoga algorytmu), w przeciwnym
razie (prawa odnoga algorytmu) działanie zostanie wykonane.
Algorytmy pomagają nam zaprogramować program przed
jego napisaniem. Dzięki nim tworzymy plan, którego będziemy
się trzymali podczas pisania kodu, aby o niczym nie zapomnieć
i się nie pogubić.
19
Powrót do spisu treści
Zmienne
Wyobraźmy sobie grę, w której użytkownik zdobywa punkty
za swoje osiągnięcia. Komputer zapamiętuje liczbę punktów
użytkownika. Jeżeli użytkownik zdobędzie dodatkowy punkt,
liczba punktów się zwiększa. Gdzie komputer zapamiętuje liczbę
punktów użytkownika? Wszystko to odbywa się w pamięci
komputera.
10
10
PUNKTY
20
Powrót do spisu treści
Zmienne
Pamięć komputera składa się z komórek, w których umieszczane
są wartości. Również nasza liczba punktów znajduje się
w jednej z nich. Takie miejsce w pamięci komputera, w którym
przechowujemy jakąś liczbę nazywamy w programowaniu
zmienną.
Nasza zmienna ma specjalną etykietę, na której znajduje się nazwa.
Dzięki niej komputer będzie mógł szybciej odnaleźć naszą
zmienną. Jak tworzymy zmienną w języku Python?
1. Zaczynamy od wymyślenia nazwy zmiennej
PUNKTY
2. Teraz przypisujemy do niej wartość za pomocą znaku =,
czyli wstawiamy do naszej komórki w pamięci komputera
to, co chcemy w niej zapamiętać:
10
PUNKTY
21
Powrót do spisu treści
Zmienne
W zmiennych możemy przechowywać różne wartości, to kilka
przykładów:
36,7
TEMPERATURA
Jan
IMIĘ
Ogrody
działkowe
NAZWA
Zatem zmienna może przechowywać nie tylko liczby całkowite,
ale także liczby z miejscami po przecinku oraz napisy zwane
w programowaniu ciągami znaków.
Wróćmy do naszej gry. Po osiągnięciu sukcesu w grze, użytkownik
zdobywa kolejny punkt. Żeby tak się stało, komputer
musi odnaleźć zmienną PUNKTY i zmienić jej wartość z 10 na 11.
Jak to będzie wyglądało w kodzie?
Albo druga wersja
Obydwie powyższe linijki kodu powiększą wartość zmiennej
o 1. Jak teraz wygląda nasza zmienna?
22
Powrót do spisu treści
Zmienne
11
PUNKTY
Właśnie wykonaliśmy operację na zmiennej. W programowaniu
możemy wykonywać różne operacje na zmiennych, wykorzystując
odpowiednie znaki. Znaki te nazywane są operatorami.
Poniżej znajdują się operatory stosowane w języku Python:
Znak Operacja Przykład
+ dodawanie PUNKTY = PUNKTY + 1
- odejmowanie PUNKTY = PUNKTY - 1
* mnożenie PUNKTY = PUNKTY * 2
/ dzielenie PUNKTY = PUNKTY / 2
//
wartość całkowita
z dzielenia
PUNKTY = PUNKTY // 2
% reszta z dzielenia PUNKTY = PUNKTY % 2
Bardzo często używane są skrócone formy znaków na przykład
+=, -=, *=, /= i tak dalej.
Jak wyglądałby kod, jeżeli chcielibyśmy dodać do siebie dwie
zmienne? Wyobraźmy sobie program stosowany w kantorach.
Komputer wykorzysta aż trzy zmienne: liczbę pieniędzy do wy-
23
Powrót do spisu treści
Zmienne
miany, kurs waluty i liczbę pieniędzy po wymianie. Zobaczmy,
jak wygląda kod w języku Python.
Tak wygląda ten program w pamięci komputera:
20
DO_WYMIANY
2,5
KURS
50
PO_WYMIANIE
Jak tworzymy nazwy zmiennych? Obowiązują tu następujące
zasady:
Nazwa zmiennej:
1. musi zaczynać się od litery lub znaku _;
2. może zawierać liczbę, ale nie może znajdować się ona na
początku nazwy;
24
Powrót do spisu treści
Zmienne
3. może zawierać małe i duże litery;
4. nie może zawierać spacji.
Przykłady poprawnych nazw zmiennych:
liczba, Liczba, LICZBA
liczba1, liczba_1, Liczba1_Liczba2
Wymyślona nazwa przypisana jest do zmiennej i nie może być
użyta ponownie do nazwy innej zmiennej. Należy jednak pamiętać,
że zmienne: liczba, Liczba, LICZBA to trzy całkiem różne
zmienne dla komputera, gdyż nazwy zmiennych składają się
z innych znaków.
Tych słów nie możemy używać jako nazw zmiennych:
and as assert break class
continue def del elif else
except exec finally for from
global if import in is
lambda nonlocal not or pass
raise return try while with
yield True False None
25
Powrót do spisu treści
Instrukcje wejścia/wyjścia
Do wyświetlania na ekranie służy funkcja print(). Wyświetlmy
zatem napis na ekranie.
Napis, który chcemy wyświetlić, umieszczamy wewnątrz nawiasów
półokrągłych. Nie możemy zapomnieć także o cudzysłowie.
Jeżeli chcemy zrobić przejście do kolejnej linijki wewnątrz
napisu, to dodajemy do niego \n.
Funkcja print automatycznie po wyświetleniu napisu przechodzi
do kolejnej linijki. Zobaczmy jak to wygląda.
26
Powrót do spisu treści
Instrukcje wejścia/wyjścia
Jeżeli nie chcemy, aby po wyświetleniu napisu wykonało się
przejście do kolejnej linijki, należy funkcję print zmodyfikować
następująco:
Jak wyświetlić na ekranie wartość zmiennej? To także bardzo
proste. Wewnątrz nawiasów półokrągłych umieszczamy nazwę
naszej zmiennej. Nie dajemy jej nazwy w cudzysłów, gdyż to
by oznaczało, że chcemy wyświetlić taki napis, a nie wartość
zmiennej o takiej samej nazwie. Zobaczmy różnicę:
27
Powrót do spisu treści
Instrukcje wejścia/wyjścia
Jak możemy wprowadzić wartość od użytkownika? Stosujemy
do tego funkcję input(). Wprowadzona przez użytkownika
wartość musi zostać zapamiętana, dlatego potrzebujemy
utworzyć zmienną, która to przechowa.
1. Tworzymy zmienną, która będzie przechowywała wartość
wprowadzoną przez użytkownika.
2. W funkcji input() dodajemy komunikat dla użytkownika,
jaką wartość ma wprowadzić.
Na ekranie pojawił się komunikat i pole do wpisania wartości.
Wprowadzoną wartość użytkownik zatwierdza klawiszem entera.
Funkcja input() traktuje jako napisy wszystkie wprowadzone
wartości. Oznacza to, że bez względu, czy użytkownik wpisze
słowo kot czy liczbę 5 komputer będzie je traktował jako tekst.
Co to oznacza? Jeżeli będziemy chcieli wprowadzić od użytkownika
wartość i następnie zwiększyć ją o 1 to wyświetli nam
się błąd. Dlaczego? Wynika to z tego, że komputer zapamiętał
wprowadzoną liczbę jako napis i nie potrafi dodać do napisu
cyfry 1. Jak zatem naprawić ten błąd?
28
Powrót do spisu treści
Instrukcje wejścia/wyjścia
Musimy nieco zmodyfikować funkcję input().
Całą funkcję umieszczamy wewnątrz nawiasów półokrągłych,
przed którymi umieszczamy słowo int(). Co to oznacza? Jest
to skrót od angielskiego słowa integer, czyli liczba całkowita.
Komputer już teraz wie, że wprowadzoną wartość ma zmienić
z napisu na liczbę. W programowaniu taki proces nazywamy
rzutowaniem. Oczywiście w tym przypadku wprowadzona wartość
zawsze będzie rzutowana na liczbę całkowitą. Jeżeli użytkownik
rzeczywiście podał liczbę całkowitą, to wszystko działa
poprawnie. Problem pojawia się, jeżeli chcemy podać liczbę
z miejscami po przecinku. Zastosowanie rzutowania int() spowoduje
obcięcie wartości po przecinku. Możemy w ten sposób
stracić ważne dla nas dane, dlatego musimy zastosować rzutowanie
float(). Jest to skrót od angielskiej nazwy liczby zmiennoprzecinkowej.
29
Powrót do spisu treści
Listy i krotki
Wyobraźmy sobie program, który ma za zadanie odczytanie
wartości średnich temperatur z siedmiu dni tygodnia. Jak komputer
może przechować te wartości? Oczywiście wiemy już,
że można utworzyć siedem zmiennych. Nie byłoby to jednak
wygodne rozwiązanie. W sytuacjach, w których chcemy zapamiętać
kilka wartości stosujemy listy. Czym jest lista?
Lista zawiera uporządkowany zbiór danych. Jak to wygląda?
Listę można porównać do pasażerów siedzących w przedziale
pociągu.
30
Powrót do spisu treści
Listy i krotki
Każdy z pasażerów siedzi na miejscu, które ma swój numer. Na
liście elementy znajdują się na pozycjach oznaczonych numerami
zwanych indeksami. Można to zobrazować następująco:
indeksy: 0 1 2 3 4 5
25 23.9 „kot”
„Ola ma
psa”
0.5 9
Na którym miejscu na liście znajduje się słowo kot? Na indeksie
numer 2. Który to z kolei element listy? To 3 element listy.
Zwróćmy uwagę, że elementy listy numerujemy od 0!
Jak stworzyć listę?
1. Zaczynamy od wymyślenia nazwy listy:
2. Następnie wpisujemy do niej wartości:
31
Powrót do spisu treści
Listy i krotki
Wartości umieszczamy w nawiasach kwadratowych, oddzielając
je przecinkami.
Jak wyciągnąć z listy któryś z elementów? Jest to bardzo proste!
Wystarczy nam nazwa listy i numer indeksu, na którym ten
element się znajduje. Wyciągnijmy zatem z naszej listy słowo
kot. Nazwa listy to wartości. Numer indeksu, na którym znajduje
się słowo kot to 2.
Zwróćmy jeszcze uwagę, że na naszej liście znajdują się zarówno
liczby, jak i napisy. W języku Python możemy umieszczać
na jednej liście różne typy danych, czyli liczby, napisy, wartości
True/False i tak dalej.
Listy w języku Python mają wbudowane wiele funkcji, które
mogą nam ułatwić pracę. Aby zobaczyć dostępne funkcje
i móc z nich skorzystać należy wpisać nazwę listy i kropkę.
32
Powrót do spisu treści
Listy i krotki
Co oznaczają poszczególne funkcje i jaki będzie wynik ich działania
dla naszej listy „lista2”?
Nazwa
funkcji
append()
clear()
copy()
count()
extend()
Opis działania funkcji
Dodawanie wartości
na koniec listy.
lista2.append(“kot”)
Funkcja usunie wartości
znajdujące się na liście.
lista2.clear()
Funkcja skopiuje
wartości listy.
lista2.copy()
Funkcja liczby, ile razy
na liście występuje
podana wartość.
lista2.count(33)
Funkcja dodaje kolejne
elementy wzięte z innej
listy, zwiększając tym
samym liczbę elementów
listy podstawowej.
lista3=[21, “pies”, 2.5]
lista2.extend(lista3)
Wynik działania funkcji
Elementy listy2:
[34,23,54,6,33,2,8,”kot”]
Pusta lista
[]
Osobna lista będąca
kopią listy2.
Liczba wystąpień liczby
33 wewnątrz listy2.
W naszym przypadku
będzie to 1.
Elementy listy2:
[34,23,54,6,33,2,8,21,
“pies”, 2.5]
33
Powrót do spisu treści
Listy i krotki
index()
insert()
pop()
Funkcja wyszukuje numer
indeksu na liście
podanej wartości.
lista2.index(54)
Funkcja wstawia dany
element pod podanym
indeksem na liście.
lista2.insert(3,”Ala”)
Funkcja usuwa i zwraca
ostatnią wartość z listy
lub podaną wartość indeksu.
Indeks, na którym znajduje
się podana wartość.
W lista2 wartość 54
występuje na pozycji
2, zatem funkcja index
zwróci wartość 2.
Elementy listy2 po wykonaniu
funkcji insert()
[34,23,54,”Ala”, 6,33,2,8]
Elementy listy2 po wykonaniu
funkcji pop()
[34,23,54, 6,33,8]
lista2.pop(5)
remove() Funkcja usuwa podany
element z listy.
Elementy listy2 po wykonaniu
funkcji remove()
lista2.remove(54)
[34,23, 6,33,2,8]
34
Powrót do spisu treści
Listy i krotki
reverse()
Funkcja odwraca kolejność
elementów listy.
Elementy listy2 po wykonaniu
funkcji reverse()
sort()
lista2.reverse()
Funkcja sortuje elementy
znajdujące się na liście.
[8,2,33,6,54,23,34]
Elementy listy2 po wykonaniu
funkcji reverse()
lista2.sort()
[2,6,8,23,33,34]
W języku Python mamy możliwość wyciągania nie tylko pojedynczych
wartości z listy, ale także jej fragmentów. Stwórzmy
listę o nazwie moja_lista i wykonajmy na niej kilka operacji.
Znak dwukropka oznacza przedział. W powyższym przykładzie
wybieramy z listy elementy od indeksu 2 do 4.
W tym przykładzie brak liczby po dwukropku oznacza wyciągnięcie
wszystkich elementów od indeksu numer 5 do końca
listy.
35
Powrót do spisu treści
Listy i krotki
Ostatni przykład pokazuje, jak zastosować dwukropek do wyciągnięcia
elementów od początku listy do elementu o indeksie 4.
Czym są krotki?
Krotki, zwane inaczej tuplami, to nieedytowalne listy. Co to
oznacza? Przy tworzeniu tupli wpisujemy do niej elementy i nie
możemy ich zmienić do końca działania programu. Jak wygląda
tupla? Tworzy się ją podobnie do listy, tylko zamiast nawiasów
kwadratowych należy użyć nawiasów półokrągłych.
36
Powrót do spisu treści
Instrukcje warunkowe
Instrukcja warunkowa jest jedną z podstawowych instrukcji
programowania i co ciekawe używamy jej na co dzień. Czasami
zdarza nam się mówić „Jeśli coś się stanie…”. Na przykład „Jeśli
pójdę spać późnym wieczorem, rano będę śpiący.” Spróbujmy
pomyśleć nad innymi przykładami z naszego życia.
Spójrzmy na kolejny przykład:
„Jeśli w weekend będzie ładna pogoda, wybierzemy się na
spacer. W przeciwnym razie zostaniemy w domu.”
Spróbujmy zobrazować to zdanie w postaci bloków algorytmu.
TAK
Czy pogoda
jest ładna?
NIE
Pójdziemy na spacer
Zostaniemy w domu
37
Powrót do spisu treści
Instrukcje warunkowe
Zatem instrukcja warunkowa jest jak skrzyżowanie, na którym
komputer musi zdecydować, w którą stronę pójdzie.
Najważniejszy jest warunek. Jeśli warunek zostanie spełniony,
skręcimy w prawo, jeśli nie, w lewo. Spróbuj przedstawić swoje
pomysły z wykorzystaniem bloków algorytmu.
Spójrz na inny przykład:
„Jeśli liczba punktów przekroczy 50, przechodzisz do następnego
poziomu. W przeciwnym razie przegrywasz grę.”
To bardzo popularny przykład z programowania. Jak wygląda
algorytm?
TAK
Czy liczba punktów
przekroczyła 50?
NIE
Przechodzisz dalej
Przegrywasz grę
38
Powrót do spisu treści
Instrukcje warunkowe
Ten sam fragment kodu w języku Python:
if punkty>50:
print(“Przechodzisz do kolejnego etapu”)
else:
print(“Przegrywasz grę”)
Przeanalizujmy, jak zbudowana jest instrukcja warunkowa:
if warunek:
działanie jeżeli warunek jest spełniony
else:
działanie jeżeli warunek nie jest spełniony
Przypominamy jednocześnie zasadę poznaną we wcześniejszym
akapicie: najważniejszy jest warunek. Jeżeli mamy problem
z utworzeniem warunku można sobie zadać pytanie, od
czego zależy, co się będzie działo dalej?. Warunek jest budowany
za pomocą znaków logicznych. Poniżej są one przedstawione
w tabeli:
Znak
a<b
a>b
a==b
a<=b
a>=b
Znaczenie
a jest mniejsze niż b
a jest większe niż b
a jest równe b
a jest mniejsze bądź równe b
a jest większe bądź równe b
39
Powrót do spisu treści
Instrukcje warunkowe
Zobaczmy to na przykładach:
I Czy użytkownik jest pełnoletni?
if wiek >= 18:
II Czy przekroczono prędkość?
if predkosc > 50:
III Czy temperatura jest ujemna?
if temperatura < 0:
IV Czy wpisano liczbę 7?
if liczba == 7:
Co jeżeli nasza decyzja jest uzależniona od kilku warunków?
Spójrz na ten przykład:
„Jeśli w weekend będzie ładna pogoda i mama będzie zdrowa,
pójdziemy na spacer. W przeciwnym razie zostaniemy
w domu.”
To nie to samo, co:
„Jeśli w weekend będzie ładna pogoda lub mama będzie zdrowa,
pójdziemy na spacer. W przeciwnym razie zostaniemy
w domu.”
W pierwszym przypadku pójdziemy na spacer, jeśli zarówno
pogoda będzie dobra, jak i mama zdrowa. W drugim przypadku
pójdziemy na spacer, jeśli spełniony zostanie co najmniej
40
Powrót do spisu treści
Instrukcje warunkowe
jeden z warunków. Aby móc wprowadzić dwa warunki, musimy
je połączyć tak zwanymi operatorami logicznymi or i and.
Operator or oznacza polskie „lub”. Stosujemy je, jeżeli chcemy,
by choć jeden warunek został spełniony. Operator and tłumaczymy
po polsku jako „i”. Jeśli stosujemy ten operator, obydwa
warunki muszą się spełnić.
Zobaczmy, jak wygląda warunek z zastosowaniem operatorów
logicznych w języku Python. W naszym przykładzie przejście
do kolejnego etapu jest możliwe, jeżeli liczba punktów jest
większa od 50.
if punkty>0 and punkty<50:
print(„Nie awansowałeś do kolejnej rundy”)
else:
print(“Awansowałeś do kolejnej rundy”)
Jeżeli nie jesteśmy pewni, czy użyliśmy dobrego operatora,
warto zadać sobie pytanie, czy chcemy, aby oba warunki zostały
spełnione, czy wystarczy jeden z nich?
41
Powrót do spisu treści
Pętle w języku Python
Pętla for
Czasami chcemy, żeby komputer wykonał jakieś polecenie wielokrotnie.
Żeby napisać:
ha
ha
ha
możemy wielokrotnie napisać ten sam fragment kodu. Będzie
to wyglądać następująco:
print(„ha”)
print(„ha”)
print(„ha”)
Nie jest to kłopot, gdy chcemy coś powtórzyć kilka razy. Ale
powtórzenie czynności kilkadziesiąt albo kilkaset razy będzie
42
Powrót do spisu treści
Pętle w języku Python
już o wiele rozsądniej zrealizować w inny sposób. Wielokrotne
wykonanie tego samego zestawu instrukcji realizuje się z wykorzystaniem
pętli. Prosta pętla, która wyświetli trzykrotnie „ha”
tak samo, jak w przykładzie powyżej, wygląda następująco:
for i in range(3):
print(“ha”)
Tłumacząc z angielskiego na polski, widzimy tu następującą instrukcję:
Dla zmiennej i w zakresie trzech powtórzeń wykonaj
polecenie: wyświetl “ha”. Pętla o nazwie pętla for jest wywoływana
przez instrukcję for. Zmienna i została utworzona,
żeby pętla mogła policzyć, ile razy ma się wykonać. 3 to liczba
wykonań pętli. Polecenie print jest wcięte (przesunięte o jedną
tabulację, czyli cztery spacje w prawo) – dzięki temu komputer
wie, że jest ono w pętli, czyli ma się wykonać tyle razy, ile razy
wykonuje się pętla.
Żeby lepiej zrozumieć, w jaki sposób komputer interpretuje pętlę,
zmieńmy nieco kod:
for i in range(3):
print(i)
print (“ha”)
43
Powrót do spisu treści
Pętle w języku Python
Program wykonał się w następujący sposób:
0
1
2
ha
Przeanalizujmy całość krok po kroku. Znów zastosowano pętlę
for i zmienną i. Tym razem po każdym obrocie pętli komputer
wyświetlił wartość zmiennej i. Wartość ta przybierała kolejno
0, 1 i 2, czyli faktycznie się zmieniała. W ten sposób komputer
policzył, że pętla ma się wykonać 3 razy. Pamiętajmy o tym, że
dla człowieka 3 razy to 1, 2 i 3, a dla komputera 0, 1 i 2. Taki sposób
liczenia wynika z omówionego na początku podręcznika
sposoby zapisu danych przez komputer: pierwszy bit danych
zapisuje jako 0 lub 1.
W tym samym przykładzie znalazła się dodatkowa linijka wyświetlająca
„ha”. Wpisana fraza wyświetliła się tylko raz, ponieważ
linijka ta nie była wcięta, a zaczynała się na tej samej
wysokości co pętla for. Zatem print („ha”) nie znajdowało się
we wnętrzu pętli, a już poza nią.
Zamiast polecenia range() można zastosować listę (lub krotkę).
Wtedy pętla wykona się tyle razy, ile jest elementów listy:
kolory = [„czerwony”, „pomarańczowy”, „żółty”, „zielony”,
„niebieski”, „granatowy”, „fioletowy”]
44
Powrót do spisu treści
Pętle w języku Python
for i in kolory:
print(i)
Powyższy kod wyświetlił nam kolejno kolory tęczy:
czerwony
pomarańczowy
żółty
zielony
niebieski
granatowy
fioletowy
Pętla wykonała się 7 razy, bo w liście kolory jest 7 elementów.
Zmienna i przyjmowała różne wartości dla każdego obiegu
pętli. Były to kolejno: czerwony, pomarańczowy, żółty itd.
Bardzo sprytnym sposobem wykorzystania pętli for jest zastosowanie
ciągu znaków jako listy:
for i in “auto”:
print(i)
W ten sposób otrzymamy na ekranie:
a
u
t
o
45
Powrót do spisu treści
Pętle w języku Python
Inny przykład:
for i in „123456”:
print(„Sprzedam”, i, „auto”)
Na ekranie wyświetli się:
Sprzedam 1 auto
Sprzedam 2 auto
Sprzedam 3 auto
Sprzedam 4 auto
Sprzedam 5 auto
Sprzedam 6 auto
Obliczenia w pętli
Pętla for oprócz wyświetlania komunikatów na ekranie, może
również posłużyć wielu innym celom, na przykład obliczeniom
matematycznym. W poniższym przykładzie policzymy, ile wartości
może przyjąć zmienna o podanej liczbie bitów. Wiemy
już, że w jednym bicie mieszczą się tylko dwie wartości: 0 i 1.
W dwóch bitach będą to cztery wartości: 00, 01, 10 i 11. Każdy
kolejny bit to wyższa potęga liczby 2. Spójrzmy na kod:
x = 2
for i in range(1, 11):
print(i, “: “, x)
x = x*2
46
Powrót do spisu treści
Pętle w języku Python
Wynik działania programu wygląda następująco:
1 : 2
2 : 4
3 : 8
4 : 16
5 : 32
6 : 64
7 : 128
8 : 256
9 : 512
10 : 1024
Przed pętlą utworzono zmienną x i przypisano jej wartość 2,
ponieważ jeden bit danych może przyjmować tylko dwie różne
wartości (wspomniane 0 i 1). Następnie utworzono pętlę for
ze zmienną i, która będzie przyjmowała wartości od 1 do 10.
Dotychczas podawaliśmy tylko liczbę obrotów pętli, a zmienna
i przyjmowała wartości od 0. Tym razem podaliśmy początkową
wartość zmiennej i, czyli 1 i wartość, której zmienna
i ma już nie osiągnąć, czyli 11. W ten sposób wartość zmiennej
i przyjmowała wartości od 1 do 10.
Każdy obieg pętli wyświetlał kolejno:
• wartość zmiennej i, która oznaczała tu liczbę bitów danych;
• dwukropek i spację dla lepszej czytelności wyników;
47
Powrót do spisu treści
Pętle w języku Python
• wartość zmiennej x, która oznaczała tu liczbę kombinacji
zer i jedynek, jaką da się zapisać w i bitach danych.
Ostatnia linijka kodu sprawia, że na koniec każdego obiegu pętli
zmienna x jest mnożona dwukrotnie, czyli stanowi kolejne
wielokrotności liczby 2.
W ten sposób obliczyliśmy, że w jednym bicie da się zapisać
dwie wartości (to już wiedzieliśmy), a w 10 bitach 1024 wartości.
To dlatego w nomenklaturze komputerowej przedrostek kilo- nie
oznacza 1000, a 1024. Na przykład kilobajt to 1024 bajty.
Pętla while
Język programowania Python oprócz pętli for, obsługuje jeszcze
pętlę while. While to po angielsku dopóki. Obsługę pętli
while wytłumaczymy na przykładzie:
i = 0
while i < 3:
print(„ha”)
i = i + 1
Trzykrotnie wyświetli się „ha”, tak samo jak w pierwszym przykładzie
dla pętli for. Kod pętli while jest w tym przykładzie
dłuższy, ale dobrze tłumaczy, jak myśli komputer. W pierwszej
linijce tworzymy zmienną i, która jest niezbędna do liczenia ob-
48
Powrót do spisu treści
Pętle w języku Python
rotów pętli. Zmienna służąca do zliczenia obiegów pętli w programowaniu
nosi nazwę iterator (dlatego skrót i). W pętli for
to też był iterator. Początkowa wartość iteratora wyniosła 0.
W drugiej linijce utworzyliśmy pętlę while, która ma się wykonywać
dopóki i jest mniejsze niż 3. W pętli wykonują się dwie
instrukcje: wyświetlanie napisu „ha” i zwiększanie wartości iteratora
o 1 przy każdym obiegu pętli. Zatem „ha” wyświetliło się
3 razy, a iterator w kolejnych 3 obiegach pętli przyjął wartości:
0, 1 i 2.
Kolejny przykład zastosowania pętli while to program wyświetlający
dolary w postaci symboli $. Tym razem to użytkownik
decyduje, ile razy pętla ma się wykonać:
i = 0
x = int(input(„Ile $? “))
while i < x:
print(“$”, end=” “)
i = i + 1
Jeżeli użytkownik poda cyfrę 5, to na ekranie wyświetli się:
Ile $? 5
$ $ $ $ $
I tym razem zaczynamy od iteratora i o wartości początkowej
0. Następnie pobieramy od użytkownika dane, które od razu
49
Powrót do spisu treści
Pętle w języku Python
przekształcamy na liczbę całkowitą. Jeśli tego nie zrobimy, to
powstanie ciąg znaków, a 5 będzie traktowane jako znak tekstowy
z klawiatury – taki sam jak „a” albo „!”, a nie liczba. Symbol x
to zmienna, w której zapisuje się liczba dolarów. Pętla while ma
wykonywać się, dopóki wartość iteratora jest mniejsza od wartości
wprowadzonej przez użytkownika. Początkowa wartość
iteratora to 0. Po wprowadzeniu przez użytkownika liczby 5,
iterator w kolejnych obiegach pętli przybrał wartości: 0, 1, 2, 3,
4. Gdy tylko iterator osiągnął wartość 5, to kolejny obieg pętli
już się nie wykonał. Pętla wykonała się zatem 5 razy. W każdym
obiegu pętli na ekranie wyświetla się $. Dodatkowy zapis
, end=“ ” sprawia, że znaki $ wyświetlają się w tej samej linii.
Gdyby tego zapisu nie było, to kolejne znaki $ pojawiłyby się
w kolejnych linijkach. Komenda “end=” określa, co ma się wyświetlać
na koniec instrukcji print. Tym razem ma to być jedna
spacja, którą zapisuje się “ “. W każdym obiegu pętli wartość
zmiennej i zwiększa się o 1.
50
Powrót do spisu treści
Funkcje
Funkcja to kod, który jest wprowadzany raz, ale może być wykonywany
wiele razy. Nie jest to jednak kod, który znajduje się
w pętli.
Wyobraźmy sobie taki problem – co zrobić, jeśli chcę wykonać
ten sam fragment kodu, ale w różnych częściach projektu? Czy
musimy wielokrotnie powtarzać ten fragment kodu? – Nie, jest
na to rozwiązanie! Do tego służą właśnie funkcje. Spróbujmy to
sobie zwizualizować.
Wyobraźmy sobie, że jesteśmy na łące.
51
Powrót do spisu treści
Funkcje
Jakie elementy znajdują się na łące? Kwiaty, trawa, rzeka, drzewo,
motyle.
Wyobraźmy sobie, że piszemy program, który rysuje łąkę.
Mamy następujące fragmenty kodu: rysowanie trawy, rysowanie
kwiatka, rysowanie trawy, rysowanie rzeki, rysowanie kwiatka,
rysowanie trawy, rysowanie rzeki i tak dalej.
Jakie części kodu się powtarzają? Trawa, kwiat, rzeka – powtarzają
się. Załóżmy, że do narysowania kwiatka potrzeba 50 linijek
kodu, a do narysowania kwiatka potrzeba 25 linijek kodu.
Te fragmenty kodu występują wielokrotnie w naszym projekcie,
ale nie możemy ich umieścić w pętli, tylko musimy powtarzać
je wielokrotnie. Nasz kod jest bardzo długi, prawda? Dlatego
stworzymy 3 funkcje. Pierwsza rysuje trawę, druga kwiat,
a trzecia rzekę. Dzięki temu nie będziemy musieli wielokrotnie
pisać tych linijek kodu. Jeśli chcemy narysować trawę, po prostu
wywołamy funkcję Rysuj trawę. Zajmie nam to jedną linijkę!
Jak to będzie wyglądało?
Rysuj_trawe()
Rysuj_kwiatka()
Rysuj_trawe()
Rysuj_rzeke()
Rysuj_kwiatka()
Rysuj_trawe()
52
Powrót do spisu treści
Funkcje
Przejdźmy teraz w inne miejsce. Jesteśmy w mieście. Jakie elementy
infrastruktury się powtarzają? Jakie będą funkcje?
Rysowanie budynku, rysowanie drogi, rysowanie samochodu.
Zobaczmy kod w Pythonie:
Rysuj_budynek()
Rysuj_ budynek()
Rysuj_drogę()
Rysuj_ budynek()
Rysuj_samochód()
Rysuj_ budynek()
53
Powrót do spisu treści
Funkcje
Ostatnie ćwiczenie. Jesteśmy teraz w kosmosie.
Jakie elementy się powtarzają? Planety, gwiazdy, meteoryty.
Takie właśnie stworzymy funkcje w programie „Kosmos”!
Rysuj_planete()
Rysuj_ gwiazde()
Rysuj_gwiazde()
Rysuj_ planete()
Rysuj_meteoryt()
Rysuj_ gwiazde()
Tworzone przez nas funkcje są bardzo proste. Przenieśmy się
ponownie na łąkę. Czy kwiaty, które widzimy, są takie same?
Nie. Różnią się kolorem, liczbą płatków, długością łodygi.
Proszę wyobrazić sobie, że jesteśmy funkcją Rysuj_kwiatek().
Teraz proszę wykonać swoje zadanie. Myślę, że pojawiło się te-
54
Powrót do spisu treści
Funkcje
raz pytanie, jaki kwiatek? Właśnie doszliśmy do bardzo ważnego
wniosku – funkcja Rysuj kwiatek potrzebuje pewnych
informacji, aby móc się wykonać. Proszę narysować kwiat z 5
niebieskimi płatkami na 3 cm łodyżce. Jakie dane musimy podać
funkcji? Liczba płatków, kolor i długość łodygi. Są to parametry,
czyli dane, które są niezbędne do wykonania funkcji.
Zatem kod w języku Python wyglądałby następująco:
Rysuj_trawe()
Rysuj_kwiatka(5, “niebieski”,3)
Rysuj_trawe()
Rysuj_rzeke()
Rysuj_kwiatka(3,”czerwony”,10)
Rysuj_trawe()
Przejdźmy do przykładu miasta. Proszę o wykonanie funkcji
Narysuj budynek. Jakich danych potrzebujemy do poprawnego
działania? W końcu w mieście mamy różne budynki. Niższe,
wyższe, bloki, kościoły, stacje benzynowe. Jaki budynek powinna
narysować nasza funkcja? Aby to wiedzieć, potrzebuje
parametrów!
Kod w języku Python:
Rysuj_budynek(10,20,”kosciol”)
Rysuj_ budynek(20,5,”stacja paliw”)
Rysuj_droge()
55
Powrót do spisu treści
Funkcje
Rysuj_ budynek(15,10,”blok”)
Rysuj_samochod()
Draw_ budynek(45,10,”kosciol”)
Pomyślmy teraz o funkcjach matematycznych, których możemy
użyć w programowaniu. Wyobraźmy sobie, że jesteśmy
funkcją o nazwie Dodawanie. Więc zsumujmy liczby! Ale jakie
liczby? Nasza funkcja musi mieć parametry, aby móc poprawnie
wykonywać swoją pracę. W tym przypadku są to liczby do
zsumowania. Jeśli nie jesteśmy pewni, jakich parametrów potrzebuje
nasza funkcja, zadajmy sobie pytanie, jakich danych
potrzebuje funkcja, aby wykonać swoją pracę?
Jak zatem wyglądają funkcje w języku Python?
Każda funkcja zbudowana jest z następujących elementów:
def nazwa_funkcji (argumenty):
zadania funkcji
return wartość_zwracana
Podkreślono elementy, które są obowiązkowe. Wyjątek stanowi
słówko return, którego używamy, jeżeli nasza funkcja ma za zadanie
zwrócić jakąś wartość. Wyobraźmy sobie funkcję, która
ma za zadanie zsumować dwie liczby:
56
Powrót do spisu treści
Funkcje
def suma (liczba1, liczba2):
druga liczba przesłana do zsumowania
pierwsza liczba przesłana do zsumowania
nazwa funkcji
Teraz należy wypełnić treść funkcji. W tym celu utworzymy
zmienną wynik, przechowującą sumę liczb.
def suma (liczba1, liczba2):
wynik = liczba1 + liczba2
Suma została obliczona. Można wynik dodawania wyświetlić
na ekranie lub zwrócić do kodu, jeżeli zostanie on wykorzystany
w dalszej części projektu. Zobaczmy, w jaki sposób można
zwrócić wartość do kodu.
def suma (liczba1, liczba2):
wynik = liczba1 + liczba2
return wynik
Komenda return zwraca znajdującą się po nim wartość do
miejsca wywołania funkcji w kodzie głównym. Jak wywołać
funkcję? To bardzo proste! Wystarczy użyć nazwy funkcji.
suma(5,7)
Jeżeli funkcja zwraca wartość, to linijka wywołania funkcji jednocześnie
będzie przyjmować wartości przez nie zwrócone. Co
57
Powrót do spisu treści
Funkcje
możemy z tym zrobić? Zapisać do zmiennej lub wyświetlić.
Zapisywanie do zmiennej:
wynik_funkcji= suma(5,7)
Wyświetlenie na ekranie:
print(suma(5,7))
58
Powrót do spisu treści
Przykładowy projekt
Stwórzmy wspólnie krok po kroku grę, w której zmierzymy się
z komputerem. W naszym programie komputer wylosuje liczbę.
Naszym zadaniem będzie odgadnięcie, jaka to liczba. Jeżeli
się pomylimy, to komputer podpowie nam, czy podaliśmy zbyt
mała, czy zbyt dużą liczbę.
Od czego zaczniemy?
import random
importowanie modułu
Rozpoczynamy od importowania modułu odpowiedzialnego
za losowanie. Choć na losowanie przyjdzie jeszcze czas, to dobrą
praktyką jest, aby wszystkie potrzebne moduły (czyli takie
pakiety różnych dostępnych w tym języku funkcji) były załączane
na samym początku programu.
Kolejnym krokiem jest utworzenie zmiennej, w której przechowamy
wylosowaną liczbę.
59
Powrót do spisu treści
Przykładowy projekt
import random
Losowa=random.randint(1,10)
Wpisanie do zmiennej wartości
zwróconej przez funkcję randint()
Zmienna ta nosi nazwę Losowa. Wpisujemy do niej instrukcję
random.randint(1,10). Co ona oznacza? Z modułu random
wybieramy (za pomocą kropki) funkcję randint(). Funkcja
ta losuje liczby całkowite z podanego zakresu. Zakres ten
wprowadzamy pomiędzy nawiasami półokrągłymi. W naszym
przypadku losujemy liczby od 1 do 10. Gdybyśmy chcieli zobrazować
wykonaną operację blokiem algorytmu, to byłby to
właśnie blok operacyjny.
Kolejnym krokiem jest utworzenie zmiennej Liczba, przechowującej
wartość podaną przez użytkownika.
import random
Losowa=random.randint(1,10)
Liczba=int(input(„Podaj liczbę”))
Wprowadzenie danych
od użytkownika
60
Powrót do spisu treści
Przykładowy projekt
Wprowadzenie wartości przez użytkownika realizujemy poprzez
instrukcję input(). Ważnym elementem tej operacji jest
rzutowanie wprowadzonej wartości na liczbę całkowitą int().
Tak jak było wspomniane w rozdziale Instrukcje wejścia/wyjścia,
rzutowanie odgrywa kluczową rolę w przyjmowaniu wartości
liczbowych i późniejszych operacjach na nich. Odwzorowaniem
przyjmowania wartości od użytkownika jest algorytmiczny
blok wejścia.
Na ten moment nasz program losuje wartość, którą użytkownik
będzie zgadywał, i pobiera od użytkownika liczbę, czyli jego
traf. Pora sprawdzić, czy wartość podana przez użytkownika
jest taka sama jak ta, którą wylosował komputer. W tym celu
użyjemy instrukcji warunkowej.
import random
Losowa=random.randint(1,10)
Liczba=int(input(„Podaj liczbę”))
if Losowa<Liczba:
Instrukcja warunkowa
Porównujemy czy zmienna Losowa ma wartość mniejszą niż
zmienna Liczba. Odpowiada to blokowi warunkowemu. Pora
61
Powrót do spisu treści
Przykładowy projekt
uzupełnić nasz program i algorytm o operacje, które zostaną
wykonane w przypadku spełnienia i nie spełnienia się warunku.
import random
Losowa=random.randint(1,10)
Liczba=int(input(„Podaj liczbę”))
if Losowa<Liczba:
print(„Podana liczba jest za duża”)
Wyświetlenie napisu
Jeżeli liczba, którą wylosował komputer, jest mniejsza niż podana
przez użytkownika, to znaczy, że użytkownik nie trafił. Na
dodatek podał liczbę za dużą. Taki też komunikat wyświetlany
jest na ekranie. Instrukcja print(), która odpowiada za wyświetlenie
komunikatu na ekranie, jest wcięta, co oznacza, że wykona
się tylko, jeżeli warunek zostanie spełniony. Co jeżeli liczba
podana przez użytkownika jest mniejsza od wylosowanej lub
równa? Musimy te przypadki dodatkowo rozpisać.
62
Powrót do spisu treści
Przykładowy projekt
import random
Losowa=random.randint(1,10)
Liczba=int(input(„Podaj liczbę”))
if Losowa<Liczba:
elif
print(„Podana liczba jest za duża”)
Jeżeli pierwszy warunek
nie jest spełniony sprawdzany jest kolejny
Instrukcja elif pozwala nam wprowadzić kolejny warunek,
który zostanie sprawdzony, jeżeli ten pierwszy nie zostanie
spełniony.
import random
Losowa=random.randint(1,10)
Liczba=int(input(„Podaj liczbę”))
if Losowa<Liczba:
print(„Podana liczba jest za duża”)
elif Losowa>Liczba:
print(„Podana liczba jest za mała”)
Jeżeli drugi warunek jest spełniony
wyświetla się stosowny napis na ekranie
Skoro już wiemy, że wylosowana liczba nie jest mniejsza od
podanej przez użytkownika, to sprawdzamy, czy jest większa.
Jeżeli tak jest, to wyświetlamy stosowny komunikat. Może okazać
się jednak, że żaden z warunków nie jest spełniony. Wtedy
należy dołożyć dodatkową instrukcję else, która wykona stosowne
operacje. W naszym przypadku nie ma innej możliwości.
63
Powrót do spisu treści
Przykładowy projekt
Skoro wylosowana liczba nie jest mniejsza ani większa od podanej
przez użytkownika, to musi być jej równa.
import random
Losowa=random.randint(1,10)
Liczba=int(input(„Podaj liczbę”))
if Losowa<Liczba:
print(„Podana liczba jest za duża”)
elif Losowa>Liczba:
print(„Podana liczba jest za mała”)
else:
print(„Zgadłeś!”)
Jeżeli żaden z powyższych
warunków nie został spełniony
Gra wygląda na skończoną, ale fajnie byłoby móc zagrać ponownie,
jeżeli za pierwszym razem nie trafiliśmy. W tym celu
dodamy do naszego projektu pętlę for. Dajmy użytkownikowi
trzy szanse.
import random
Losowa=random.randint(1,10)
for i in range(3):
Pętla (powtórzenie instrukcji trzykrotnie)
Liczba=int(input(„Podaj liczbę”))
if Losowa<Liczba:
print(„Podana liczba jest za duża”)
elif Losowa>Liczba:
print(„Podana liczba jest za mała”)
else:
print(„Zgadłeś!”)
Proszę zwrócić uwagę, że wszystkie instrukcje znajdujące się
64
Powrót do spisu treści
Przykładowy projekt
w pętli są wcięte. Oznacza to, że te linijki podlegają powtórzeniu.
Dodatkowo linijki znajdujące się wewnątrz instrukcji warunkowych
są wcięte dwukrotnie, czyli przez użycie podwójnego
klawisza tabulacji lub 8 spacji.
W naszym programie jest jednak pewien błąd. Czy już go dostrzegacie?
Tak, nawet jeżeli podamy poprawną liczbę, to i tak komputer
prosi nas o ponowne podanie, gdyż nasza pętla nie kończy się
wraz z podaniem poprawnej odpowiedzi. Jedyny przypadek,
w którym program działa poprawnie to ten, w którym poprawną
liczbę podamy jako trzecią. Wtedy pętla kończy się i wydawać
by się mogło, że program działa poprawnie. Co zatem
zrobić, by nawet po pierwszym lub drugim trafieniu program
się kończył? W tym celu użyjemy instrukcji break.
import random
Losowa=random.randint(1,10)
for i in range(3):
Liczba=int(input(„Podaj liczbę”))
if Losowa<Liczba:
print(„Podana liczba jest za duża”)
elif Losowa>Liczba:
print(„Podana liczba jest za mała”)
else:
print(„Zgadłeś!”)
break Przerwanie pętli
65
Powrót do spisu treści
Przykładowy projekt
Instrukcja break przerywa pętlę. Dzięki temu podanie poprawnej
odpowiedzi zakończy grę. Nasz program można uznać za
skończony. My jednak dokonamy jeszcze jednej modyfikacji.
Część programu przeniesiemy do funkcji.
import random
Losowa=random.randint(1,10)
for i in range(3):
Liczba=int(input(„Podaj liczbę”))
if Losowa<Liczba:
print(„Podana liczba jest za duża”)
elif Losowa>Liczba:
print(„Podana liczba jest za mała”)
else:
print(„Zgadłeś!”)
break
Przeniesienie
instrukcji do
funkcji
Jak zaznaczony fragment kodu będzie wyglądał w funkcji?
import random
def sprawdzanie (wylosowana, wprowadzona):
if wylosowana > wprowadzona:
print(„Podana liczba jest za duża”)
return 0
elif wylosowana > wprowadzona:
print(„Podana liczba jest za mała”)
return 0
else:
print(„Zgadłeś!”)
return 1
Losowa=random.randint(1,10)
for i in range(3):
Liczba=int(input(„Podaj liczbę”))
66
Powrót do spisu treści
Przykładowy projekt
Funkcję umieszczamy tuż pod linijką importowania modułu
random. Zaczynamy od wpisania słówka def i wymyślenia
nazwy funkcji. W naszym przypadku będzie to sprawdzanie.
Czy nasza funkcja potrzebuje do działania jakichś dodatkowych
danych – parametrów? Otóż tak! Nasza funkcja,
jak sama nazwa wskazuje, ma tylko sprawdzić, jaka liczba została
wylosowana względem podanej przez użytkownika. Zatem
potrzebuje wiedzieć, ile wynoszą sprawdzane przez nią
wartości. W związku z tym wysyłamy do naszej funkcji wartość
wylosowaną i wprowadzoną. Zwróćmy uwagę, że nazwy
zmiennych różnią się od tych podanych w funkcji. To celowy
zabieg, aby nie wprowadzać nas w błąd, że nie musimy wysyłać
tych liczb, bo przecież zostały one już stworzone i są
w programie. Funkcja ich nie widzi, bo są w innej części kodu
i dla porządku powinniśmy nadać inne nazwy wysłanym wartościom.
W naszej funkcji musimy zmienić nazwy zmiennych,
aby były zgodne z tymi, które do niej wysłaliśmy. W naszym
głównym kodzie pozostała jednak pętla, która musi zakończyć
się w odpowiednim momencie. Musimy zatem w jakiś sposób
skomunikować wynik działania funkcji z działaniami pętli. Do
tego wykorzystamy wartość zwracaną przez funkcję instrukcją
return. Jeżeli użytkownik odgadnie poprawną liczbę, to
funkcja zwraca wartość 1, jeżeli nie to 0. Wywołajmy funkcję
w pętli i zapamiętajmy, co zwróciła.
67
Powrót do spisu treści
Przykładowy projekt
import random
def sprawdzanie (wylosowana, wprowadzona):
if wylosowana > wprowadzona:
print(„Podana liczba jest za duża”)
return 0
elif wylosowana > wprowadzona:
print(„Podana liczba jest za mała”)
return 0
else:
print(„Zgadłeś!”)
return 1
Losowa=random.randint(1,10)
for i in range(3):
Liczba=int(input(„Podaj liczbę”))
Zwrocona_wartosc=sprawdzanie(Losowa, Liczba)
Teraz zmienna Zwrocona_wartosc przechowuje wynik działania
funkcji. Wykorzystajmy tę informację do sterowania działaniem
pętli. Pamiętamy, że chcemy, by pętla zakończyła swoje działanie,
jeżeli użytkownik poprawnie odgadnie liczbę, a nie dopiero
po trzech wykonaniach się pętli. Dołóżmy zatem stosowne
instrukcje warunkowe. Od czego będzie teraz zależeć, czy pętla
ma się dalej wykonywać czy nie? Oczywiście od wartości
zmiennej Zwrocna_wartosc.
68
Powrót do spisu treści
Przykładowy projekt
import random
def sprawdzanie (wylosowana, wprowadzona):
if wylosowana > wprowadzona:
print(„Podana liczba jest za duża”)
return 0
elif wylosowana > wprowadzona:
print(„Podana liczba jest za mała”)
return 0
else:
print(„Zgadłeś!”)
return 1
Losowa=random.randint(1,10)
for i in range(3):
Liczba=int(input(„Podaj liczbę”))
Zwrocona_wartosc=sprawdzanie(Losowa, Liczba)
if zwrocona_wartosc==1:
break
Teraz możemy uznać nasz projekt za zakończony. W jaki sposób
możemy jeszcze go rozbudować?
1. Dołożyć system zabezpieczeń, by użytkownik nie mógł
wprowadzać wartości spoza losowanego zakresu. Jak tego
dokonać? Wystarczy wprowadzić prostą instrukcję warunkową,
która po wprowadzeniu wartości przez użytkownika
sprawdzi ją.
69
Powrót do spisu treści
Przykładowy projekt
import random
def sprawdzanie (wylosowana, wprowadzona):
if wylosowana > wprowadzona:
print(„Podana liczba jest za duża”)
return 0
elif wylosowana > wprowadzona:
print(„Podana liczba jest za mała”)
return 0
else:
print(„Zgadłeś!”)
return 1
Losowa=random.randint(1,10)
for i in range(3):
Liczba=int(input(„Podaj liczbę”))
if Liczba < 1 or Liczba > 10:
print(„Podałeś liczbę spoza zakresu”)
else:
Zwrocona_wartosc=sprawdzanie(Losowa, Liczba)
if zwrocona_wartosc==1:
break
Niestety rozwiązanie to powoduje, że po wprowadzeniu błędnej
wartości, użytkownik traci jedną ze swoich trzech szans,
gdyż błędna wartość nie podlega sprawdzeniu przez funkcję.
Co zrobić, by program wymuszał wprowadzenie poprawnej
wartości (czyli wartości z zakresu od 1 do 10), bez utraty szans?
Wykorzystajmy do tego pętlę while.
70
Powrót do spisu treści
Przykładowy projekt
import random
def sprawdzanie (wylosowana, wprowadzona):
if wylosowana > wprowadzona:
print(„Podana liczba jest za duża”)
return 0
elif wylosowana > wprowadzona:
print(„Podana liczba jest za mała”)
return 0
else:
print(„Zgadłeś!”)
return 1
Losowa=random.randint(1,10)
for i in range(3):
Liczba=int(input(„Podaj liczbę”))
while Liczba < 1 or Liczba > 10:
print(„Podałeś liczbę spoza zakresu”)
Liczba=int(input(„Podaj ponownie liczbę”))
Zwrocona_wartosc=sprawdzanie(Losowa, Liczba)
if zwrocona_wartosc==1:
break
Teraz pętla while będzie wykonywała się, dopóki użytkownik
nie poda poprawnej wartości. Zwróćmy uwagę na operator logiczny
or, który wskazuje, że wartość niższa niż 1 albo wartość
wyższa niż 10 jest niepoprawna. Nie moglibyśmy w tym
przypadku użyć operatora and (choć intuicja mogłaby tak nam
podpowiadać), gdyż warunek sprawdzałby, czy podana przez
nas wartość jest mniejsza od 1 i większa od 10 jednocześnie. Nie
ma takiej możliwości, więc pętla nigdy by się nie wykonywała,
a zatem nadal program działałby niepoprawnie.
71
Powrót do spisu treści
Przykładowy projekt
2. Moglibyśmy także pytać użytkownika, czy nadal chce kontynuować
grę. W tej chwili nasz program wymusza wprowadzenie
kolejnych wartości. Zmiana ta także jest możliwa,
dzięki wykorzystaniu prostej instrukcji warunkowej.
import random
def sprawdzanie (wylosowana, wprowadzona):
if wylosowana > wprowadzona:
print(„Podana liczba jest za duża”)
return 0
elif wylosowana > wprowadzona:
print(„Podana liczba jest za mała”)
return 0
else:
print(„Zgadłeś!”)
return 1
Losowa=random.randint(1,10)
for i in range(3):
Liczba=int(input(„Podaj liczbę”))
if zwrocona_wartosc==1:
break
else:
decyzja=input(„Czy chcesz kontynuować grę? Tak/Nie”)
if decyzja==„Nie”:
print(„Koniec gry”)
break
W tym celu utworzymy sobie zmienną decyzja, która przechowa
„Tak” lub „Nie” w zależności od decyzji użytkownika. Jeżeli
użytkownik odpowie „Nie” pętla przerwie się, a na ekranie
użytkownika wyświetli się komunikat informujący o zakończeniu
gry. Zwróćmy uwagę, że słowo „Nie” w instrukcji warunko-
72
Powrót do spisu treści
Przykładowy projekt
wej jest napisane w cudzysłowie. To bardzo ważna kwestia jeśli
chcemy porównywać wartość zmiennej do napisu. Gdybyśmy
nie dodali cudzysłowu, komputer potraktowałby słowo „Nie”
jako nazwę zmiennej i szukał jej w programie. Inaczej sytuacja
wygląda, jeżeli porównujemy wartość zmiennej do liczby. Liczb
nie zapisujemy w cudzysłowie, gdyż oznaczałoby to, że są napisami.
Nic w tym złego, ale musimy wtedy sprawdzić, czy pod
naszą zmienną przechowujemy liczbę 5 czy napis „5”. Jeżeli
przechowujemy liczbę 5, a porównalibyśmy ją z napisem „5”
to komputer uznałby, że to dwie różne wartości. Nasze udoskonalenie
programu jest jednak jeszcze niedoskonałe. Dlaczego?
Błąd tkwi w tym, że użytkownik może na wiele sposobów
wprowadzać słowo „Nie”. Mógłby napisać „nie”, „NIE”, „NiE”
i tak dalej. Nasz program sprawdza, czy napis wygląda następująco:
„Nie”. Jak już wytłumaczyliśmy – użytkownik może celowo
lub przypadkiem wprowadzić ten napis inaczej. Musimy
się przed taką sytuacją zabezpieczyć. Najlepiej będzie, jeżeli
uniezależnimy się od formy, w jakiej użytkownik wpisał to słowo.
W tym celu zastosujemy funkcję upper(). Jest to funkcja,
która zmienia litery w napisie na duże.
73
Powrót do spisu treści
Przykładowy projekt
import random
def sprawdzanie (wylosowana, wprowadzona):
if wylosowana > wprowadzona:
print(„Podana liczba jest za duża”)
return 0
elif wylosowana > wprowadzona:
print(„Podana liczba jest za mała”)
return 0
else:
print(„Zgadłeś!”)
return 1
Losowa=random.randint(1,10)
for i in range(3):
Liczba=int(input(„Podaj liczbę”))
if zwrocona_wartosc==1:
break
else:
decyzja=input(„Czy chcesz kontynuować grę? Tak/Nie”)
decyzja=decyzja.upper()
if decyzja==„NIE”:
print(„Koniec gry”)
break
Zmienne przechowujące napisy mają tak zwane funkcje wbudowane.
Są to funkcje, których możemy używać w celu modyfikacji
napisów przechowywanych pod tymi zmiennymi.
Do takich funkcji należy funkcja upper(). Oczywiście jest ich
znacznie więcej. Wystarczy, że po nazwie zmiennej postawimy
kropkę i naciśniemy klawisz TAB.
74
Powrót do spisu treści
Przykładowy projekt
Używając funkcji upper(), porównujemy wartość przechowywaną
w zmiennej do słowa „NIE”, gdyż wiemy, że jest w takiej
formie. A co jeżeli użytkownik poda słowo „Tak”? Warunek instrukcji
warunkowej nie zostanie spełniony i program po prostu
będzie wykonywał się dalej. Niestety program będzie działał
dalej nawet jeżeli użytkownik wprowadzi jakieś inne słowo niż
„Tak” lub „Nie”. Może będzie próbował wpisać to w innym języku,
np. „Yes”, „No”, albo popełnił literówkę i zamiast „Nie” wpisze
„Ne”. Warto wprowadzić odpowiednie komunikaty wyjaśniające
to nieporozumienie. Możemy to rozwiązać na przykład
dodając instrukcję elif.
75
Powrót do spisu treści
Przykładowy projekt
import random
def sprawdzanie (wylosowana, wprowadzona):
if wylosowana > wprowadzona:
print(„Podana liczba jest za duża”)
return 0
elif wylosowana > wprowadzona:
print(„Podana liczba jest za mała”)
return 0
else:
print(„Zgadłeś!”)
return 1
Losowa=random.randint(1,10)
for i in range(3):
Liczba=int(input(„Podaj liczbę”))
if zwrocona_wartosc==1:
break
else:
decyzja=input(„Czy chcesz kontynuować grę? Tak/Nie”)
decyzja=decyzja.upper()
if decyzja==„NIE”:
print(„Koniec gry”)
break
elif decyzja !=„TAK”:
print(„Podałeś błędny napis”)
Instrukcja elif sprawdza, czy decyzja jest różna od „TAK”. Warunek
ten wyklucza nie tylko popełnienie literówki w słownie
„NIE”, ale także wpisanie innego, nieprzewidzianego przez programistę
słowa.
3. Inną formą rozbudowania programu może być dołożenie
kolejnych poziomów trudności. Odgadnięcie liczby w pierwszej
rundzie pozwala przejść do kolejnej, w której np. liczby
76
Powrót do spisu treści
Przykładowy projekt
losowane są z szerszego zakresu lub użytkownik ma mniej
szans na odgadnięcie liczby. Zarówno jeden jak i drugi pomysł
bardzo łatwo zaimplementować. Rozważmy rozszerzenie
zakresu, z którego losowana jest liczba.
import random
def sprawdzanie (wylosowana, wprowadzona):
if wylosowana > wprowadzona:
print(„Podana liczba jest za duża”)
return 0
elif wylosowana > wprowadzona:
print(„Podana liczba jest za mała”)
return 0
else:
print(„Zgadłeś!”)
return 1
Runda=1
while True:
Losowa=random.randint(1,Runda*10)
for i in range(3):
Liczba=int(input(„Podaj liczbę”))
Zwrocona_wartosc=sprawdzanie(Losowa, Liczba)
if zwrocona_wartosc==1:
Runda=Runda+1
break
else:
break
Implementację kolejnych poziomów w grze rozpoczynamy od
utworzenia zmiennej Runda. Zmienna ta będzie zapamiętywała,
w której rundzie aktualnie jest gracz, a jej wartość będzie wpływała
na zakres losowania liczb do odgadnięcia. Całość programu
trafi do pętli while, wykonującej się teoretycznie w nie-
77
Powrót do spisu treści
Przykładowy projekt
skończoność, co daje nieograniczoną liczbę rund dla gracza.
W każdej rundzie gracz ma nadal trzy szanse. Jeżeli odgadnie
prawidłową wartość, to o 1 zwiększa mu się wartość zmiennej
Runda, czyli dostaje awans do kolejnej rundy. W kolejnej rundzie
liczby są losowane od 0 do numeru rundy pomnożonego razy
10, co sprawia, że w każdej kolejnej rundzie zakres jest większy,
a zatem szansa na trafienie poprawnej liczby jest mniejsza.
Jeżeli gracz nie odgadnie liczby w trzech podejściach,
to przegrywa grę. Zwróćmy uwagę, że instrukcja else jest na
wysokości pętli for, a nie jak mogłoby nam się wydawać na
wysokości instrukcji if. Nie jest to błąd, jest to bardzo ważny
element programu. Jeżeli pętla for zostanie przerwana instrukcją
break (czyli wcześniej niż zakładaliśmy na początku), wtedy
instrukcja else nie wykonuje się. Jeżeli jednak pętla wykona
się bez przerwania trzy razy, wtedy następnie wykona się instrukcja
break znajdująca się wewnątrz instrukcji else. Dlaczego
tak to zaimplementowaliśmy? Wykonanie pętli for trzykrotnie,
świadczy o tym, że nie została odgadnięta liczba, a zatem
użytkownik nie dostaje awansu do kolejnej rundy. Przerwanie
pętli while jest możliwe, właśnie dzięki instrukcji break umieszczonej
poza pętlą for.
78
Powrót do spisu treści
Podsumowanie
W tym miejscu chcielibyśmy zakończyć naszą pierwszą przygodę
z językiem programowania Python.
Na koniec warto powtórzyć, że jest to bardzo popularny i niezwykle
potężny język programowania. Dużo firm tworzących
gry i programy komputerowe korzysta teraz właśnie z Pythona.
Jeśli czujesz, że udało Ci się poznać podstawy tego języka i rozumiesz
jego podstawowe elementy, to być może warto pójść
dalej i poznać ten język trochę lepiej?
Pamiętaj, że w każdej chwili możesz wrócić na naszą platformę
edukacyjną HearIT! Jeśli będziesz uczył się samodzielnie
z innego podręcznika, jeśli znajdziesz kurs internetowy i pojawią
się tam pojęcia, których nie rozumiesz, wróć na naszą
stronę i poszukaj odpowiedniego pojęcia w słowniku programowania
PJM!
79
Powrót do spisu treści
Podsumowanie
Mamy nadzieję, że udało nam się ułatwić Ci rozpoczęcie nauki
programowania! Teraz dużo już będzie zależeć od Ciebie! Jeśli
programowanie Cię zainteresowało, to do dzieła! Powodzenia
i niech KOD BĘDZIE Z TOBĄ!!!
80
Powrót do spisu treści
Żywa pagina
81
Powrót do spisu treści