24.08.2022 Views

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

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!