Python #1 – zmienne, operatory i funkcje wbudowane

Jeśli dobrze liczę, to jest to już czterdziesty artykuł na tym blogu. Pokazałem już wam, jak można całkiem sensownie zabrać się za uczenie maszynowe, ale w sumie nie pokazywałem ani razu jak zabrać się za Pythona. Myślę więc, że już czas na zapoznanie się z najpopularniejszym językiem programowania w uczeniu maszynowym, którym jest Python!

Anaconda Python + Jupyter Notebook

Nie będę się tutaj rozpisywał nad instalacją i przygotowaniem środowiska, bo zrobiłem już to częściowo we wpisie Jak jedną linijką przygotować sobie środowisko R z ggplot2?. Zacznij wiec od zainstalowania Anacondy według instrukcji, które tam umieściłem. Nie musisz instalować R, ale przydałoby Ci się środowisko Jupyter Notebook, żeby wygodnie testować swoje nowe umiejętności. Jak już będziesz mieć Anacondę, to wystarczy kilka poleceń (bash na Linuksie i MacOS), aby przygotować miejsce pracy:

conda create -y -n nauka-python
source activate warsztat-ggplot2
conda install -y rstudio
jupyter-notebook

W ten sposób przygotowałeś swoje środowisko wirtualne i zainstalowałeś IDE Jupyter Notebook. Jeżeli będziesz chciał powrócić do swojego środowiska pracy, to wystarczy, że powtórzysz kroki 2 i 4. Aby zacząć programować w Pythonie, musimy jeszcze stworzyć odpowiedni notebook. Zrobimy to za pomocą menu w prawym górnym rogu.

Nowy notebook
Nowy notebook

Teraz pozostał tylko jeden mały detal. Jeśli programowałeś już w Pythonie albo w jakimś innym języku programowania, to zapewne przyzwyczaiłeś się do uruchamiania całego projektu albo całych plików. Jupyter Notebook umożliwia nam natomiast uruchamianie pojedynczych komórek, które mogą zawierać jedną lub kilka instrukcji. Taka komórka wygląda następująco:

Komórka Jupyter Notebook
Komórka Jupyter Notebook

Tam, gdzie mamy In [1]: wpisujemy nasz kod. Po wpisaniu kodu i wciśnięciu Shift+Enter komórka ta zostanie wykonana i pojawi się wynik instrukcji. Proste, nie?

Funkcja print()

Python sam z siebie za bardzo nie chce się z nami komunikować. Jeżeli kodujemy coś w Jupyter Notebook, to wynik ostatniej operacji będzie wyświetlany na ekranie, chyba że takiego wyniku „dla człowieka” miało nie być. Co natomiast jeśli chcemy uzyskiwać informacje na temat tego, co się dzieje w naszym skrypcie? Najprostszym rozwiązaniem będzie użycie funkcji print(). Funkcja print weźmie wynik operacji w nawiasie i zadba (o ile to w ogóle możliwe) o wypisanie jej na ekran. Brzmi trywialnie, ale jeśli jeszcze nie jest, to będzie to jedna z najczęściej używanych przez Ciebie funkcji ;-).

Operatory arytmetyczne

Ok, zróbmy więc coś konkretnego. Użyjmy Pythona jako kalkulatora! Aby tego dokonać, powinniśmy zapoznać się z operatorami arytmetycznymi. Operatory te to nic innego jak „znaki działań”, które poznaliśmy w szkole. No, z małymi różnicami. Przyjrzyjmy się tym operatorom:

  • + -> a + b – dodawanie – suma wartości a i b
  • – -> a – b – odejmowanie – różnica wartości a i b
  • * -> a * b – mnożenie – iloczyn wartości a i b
  • / -> a / b – dzielenie – iloraz wartości a i b
  • // -> a // b – dzielenie całkowite – wynik dzielenia a i b zaokrąglony w dół
  • % -> a % b – modulo – reszta z dzielenia a i b
  • ** -> a ** b – potęga – wynik wartości a podniesionej do potęgi b
  • – -> -a – negacja – negacja wartości a

Zobaczmy na przykłady z dzieleniem:

print(11 / 2)
print(10 / 2)
5.5
5.0
print(11 // 2)
print(10 // 2)
5.0
5.0

Chyba czujesz już, o co chodzi? Pozostaje tutaj jeszcze jedna ważna informacja, a mianowicie chodzi o kolejność działań. W Pythonie wygląda to tak: nawiasy, potęga, mnożenie/dzielenie, dodawanie/odejmowanie. Warto o tym pamiętać, bo Python nie jest w stanie odgadnąć, o co nam chodzi:

print(16 - 3 + 2)
print(-30 + 4 * 2)
15
-22

Zmienne

Skoro mamy już kalkulator, to możemy iść krok dalej. No bo języki programowania umożliwiają nieco więcej działań niż powyższe. Pozwalają nam na zapisywanie, odczytywanie i modyfikowanie wartości za pomocą zmiennych. Brzmi strasznie, a tak naprawdę chodzi o tworzenie pudełek, do których wrzucamy wartości. Stwórzmy sobie zmienną o nazwie cukierki i umieśćmy w niej wartość 0. Możemy sobie wyobrazić, że oznacza to, że mamy 0 w pudełku o nazwie cukierki. Dodajmy do tej zmiennej wartość 3 – Python weźmie 0 z tego pudełka, doda do niego 3 i wynik wsadzi z powrotem do pudełka o nazwie cukierki:

cukierki = 0
print(cukierki)

cukierki = cukierki + 3
print(cukierki)
0
3

Fajne te zmienne, nie? Nie musimy trzymać tego wszystkiego w głowie, przerzucamy to do programu i operujemy tylko na pudełkach. Sprawdźmy (zwróć również uwagę na kolejność działań):

obcas_cm = 10
wzrost_cm = 170

# Jaką będę mieć wysokość w metrach?

wysokosc_m = obcas_cm + wzrost_cm / 100
print("Wysokość w metrach = {} ??!".format(wysokosc_m))

wysokosc_m = (obcas_cm + wzrost_cm) / 100
print("Wysokość w metrach = {} !".format(wysokosc_m))
Wysokość w metrach = 11.7 ??!
Wysokość w metrach = 1.8 !

Liczby to nie jedyne co możemy wrzucać do zmiennych, możemy wrzucać tam również napisy i nasze własne typy danych jakiekolwiek by one nie były!

Typy danych

Jak już o typach danych mówimy, to być może zauważyłeś, że w żaden sposób nie mówiliśmy Pythonowi jakiego rodzaju informację ma wrzucać do pudełek. Python sam dobiera „rodzaj pudełka”, gdy ma do niego wrzucić dane. Nazywa się do dynamiczne typowanie. W przeciwieństwie do statycznego typowania gdzie przed wrzuceniem informacji do pudełka musimy jeszcze określić, jakie to ma być pudełko. Ma to swoje wady i zalety, o których nie będę się tutaj rozpisywał. Warto jednak mieć na uwadze, że jeśli nie jesteśmy pewni, jakiego typu jest zmienna, zawsze możemy to sprawdzić:

print(type(cukierki))
print(type(36.6))
print(type("słodycze"))
<class 'int'>
<class 'float'>
<class 'str'>

Na tym etapie najbardziej interesuje nas to, że liczby całkowite to int a te z przecinkami to float. Czemu tak? No bo liczby z przecinkami zajmują nieco więcej pamięci, więc jeśli wiemy, że będziemy pracować na liczbach całkowitych (np. liczba osób w autobusie), to powinniśmy z nich korzystać. A napisy są typu str.

Jeśli zachodzi potrzeba, to możemy dokonywać przekształceń między typami. Z int możemy bez problemu przejść na str i float. Z float bez problemu przeskoczymy na str, ale jeśli będziemy zmieniać na int, to stracimy to, co było po przecinku. Natomiast str jest nieco bardziej skomplikowany. Jeśli jest tam faktycznie liczba i ewentualnie jakieś białe znaki to konwersje na int i float zadziałają. Ale jeśli są tam jeszcze jakieś inne symbole, to pewnie skończy się to błędem. Na ogół przy tego typu działaniach trzeba się całkiem nieźle nagimnastykować i jest to całkiem spory osobny temat w programowaniu. Mały przykład udanych konwersji (zwróć uwagę na to, jak dodajemy komentarze do kodu):

print(float(10))
print(int(3.33))

# Można też przekształcić napisy!

print(int('807') + 1)
10.0
3
808

Funkcje wbudowane

Operatory i zmienne to nie wszystko. Z każdym językiem programowania dostajemy też funkcje wbudowane. Są to funkcje, które twórcy języka uznali za tak ważne, że od razu zdecydowali się je dołożyć do języka. Na samym początku artykułu poznałeś jedną funkcję wbudowaną. Jest to funkcja print(). Na tym etapie powinny Ci się spodobać trzy kolejne funkcje (nie licząc funkcji przekształcających typy): min(), max() i abs(). min i max to funkcje, które przeglądają wszystkie liczby w nawiasie (oddzielone przecinkiem) i wybierają odpowiednio najmniejszą i największą. A funkcja abs zwraca wartość bezwzględną, z tego, co otrzymała w nawiasie:

print(min(10000000, -2, 70))
print(max(10000000, -2, 70))
print(abs(42))
print(abs(-42))
-2
10000000
42
42

Instrukcja warunkowa

Ostatnią „rzeczą”, jaką poznasz w tym artykule to instrukcja warunkowa. Sprawia ona, że jakiś kod się wykona, jeśli jakiś warunek został spełniony. Załóżmy, że programujemy dziecko, które ma powiedzieć „WOW, Mam cukierki!”, jeśli zmienna cukierki ma wartość większą niż 0. Oprócz tego też, dziecko to ma cukrowy haj i zawsze będzie mamrotać pod nosem „słodycze słodycze słodycze”. Jak by to wyglądało w Pythonie?

# Nie ma cukierków - nie ma entuzjazmu
cukierki = 0
if cukierki > 0:
    print("WOW, Mam cukierki!")
    
dziecko_mowi = "słodycze słodycze słodycze"
print(dziecko_mowi)


# Są cukierki - jest entuzjazm
cukierki = 400
if cukierki > 0:
    print("WOW, Mam cukierki!")
    
dziecko_mowi = "słodycze słodycze słodycze"
print(dziecko_mowi)
słodycze słodycze słodycze
WOW, Mam cukierki!
słodycze słodycze słodycze

I teraz natrafiłeś na najlepszy albo najgorszy element języka Python – wcięcia. Spotkałem się z obydwoma opiniami na ten temat, przy czym ta pierwsza zdecydowania przeważa. O co tutaj chodzi? Większość języków programowania bloki kodu oznacza specjalnymi nawiasami. A w Pythonie blok kodu oznacza się symbolem : a jego treść jest zaznaczona wcięciem (np. 4 spacje). Oznacza to tyle, że linijki 4 i 13 wykonają się tylko pod warunkiem występującym w linijkach 3 i 13. A tam, gdzie nie ma wcięcia, to kod wykona się niezależnie od warunku. Jest to fajne, bo od razu widać zawartość bloku warunkowego i nie trzeba zdawać się na łaskę programisty, że oznaczy je wcięciami. Może to natomiast być katastrofalne, jeśli przypadkiem wciśniemy kiedyś tab i jakaś instrukcja zostanie wsadzona do bloku warunkowego. Albo coś się zepsuje przy kopiowaniu i wklejaniu.

Na koniec jeszcze jedna mała ciekawostka: co się stanie, jeśli pomnożymy napis przez liczbę?

dziecko_mowi = "słodycze " * cukierki
print(dziecko_mowi)
słodycze słodycze słodycze 

Ćwiczenia

Jeśli chciałbyś przećwiczyć nowo nabyte umiejętności, to możesz spróbować swoich sił z następującymi ćwiczeniami:

  • stworzyć zmienną marka, przypisać do niej napis, który jest marką twojego ulubionego samochodu i wyświetlić ten napis na ekranie.
  • przyjmij, że zmienna pi równa się 3.14159 a zmienna promien równia się 7. Oblicz powierzchnię i objętość kuli.
  • utwórz zmienne a i b z jakimiś wartościami, następnie zrób tak, żeby wartość z a wylądowała w b, a z b w a. Podpowiedź: możesz użyć trzeciej zmiennej ;-).
  • wstaw nawiasy tak, żeby wyszło 1: 18 – 7 // 11 a tutaj 0: 16 – 123 * 4 – 2 + 2.

Artykuł ten jest inspirowany następującą lekcją z Kaggle.

Interaktywna wersja przykładów znajduje się tutaj.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *