Wspominaliśmy trochę o zmiennych, czyli pudełkach w pamięci, które mogą przechowywać różne rzeczy – choć w Pythonie zmienna to raczej coś co zawiera informacje gdzie jest pudełko np. z jedynką.
No właśnie, w programach przechowujemy dane różnego typu, bo różne rzeczy mogą się nam przydać. Przykładowo mamy tekst (nasze stringi), ale mamy także liczby. No i liczby, w komputerze dzielimy na takie bez przecinka (w programowania używamy kropki) lub posiadające część „po przecinku”.
Dane
Zmienne wskazują więc na pudełka w pamięci (zawierają informacje gdzie jest dane pudełko). Pudełka z kolei mogą zawierać różne rzeczy – i to właśnie są dane. W Pythonie mamy kilka podstawowych typów danych, między innymi mamy Numbers, String czy List. Oczywiście w Pythonie wszystko jest obiektem, więc nasze zmienne i pudełka to także obiekty.
Typy danych
Wiemy już, że różne dane, mogą mieć różne typy (nasze Numbers, String itp.). W wielu językach programowanie musimy te typy podawać deklarując zmienną, pisząc przykładowo: int zmienna1 – co znaczy po prostu, że tworzymy zmienną typu int (skrót od integer – liczba całkowita, integralna). Jest to tzw. static cast czyli typowanie statyczne. Jednak Python używa dynamic cast, czyli typowania dynamicznego. O co chodzi? Ano o to, że nie musimy w Pythonie podawać jakiego typu coś jest. Interpreter za nas wywnioskuje jakiego typu ma byś dany obiekt. Jak to zrobi? Z kontekstu.
Jeśli piszesz mi zmienna1 = 1, to ja domyślam się, że zmienna1 ma być typu liczbowego (bo wpisałeś liczbę), ponadto jest wysoce prawdopodobne, że ma być to typ liczbowy całkowity – czyli int. Przecież wpisałeś liczbę bez przecinka, po znaku równości.
Jednyn słowem, w Pythonie wystarczy wymyślić jakąś nazwę dla zmiennej, po czym przypisać wartość.
Plusy typowania dynamicznego są liczne: mamy większą elastyczność (ta sama zmienna może później przyjąć wartość innego typu), fakt, ze nie musimy myśleć ciągle o typie danych i go określać. Minusem zaś jest to, że istnieje jakby niebezpieczeństwo przypisania danych niewłaściwego typu – mamy zmienną, która powinna przechowywać int, ale na skutek późniejszych operacji okazuje się, że zmienna przechowuje liczby float (zmiennoprzecinkowe), wtedy mogą się pojawić błędy.
Liczby czyli Numbers
Liczby czyli Numbers, mają takich kilka podstawowych typów.
integer | float |
liczba całkowita | liczba zmiennoprzecinkowa |
34 | 6.45 |
Są jeszcze liczby zespolone, ale na razie pomówmy o tych dwu typach – są one najpopularniejszymi i najczęściej spotykanymi w programowaniu.
Numbers w praktyce
Zacznijmy od intów, czyli liczb typu integer, w skrócie int. Są to liczby całkowite – typ podstawowy danych liczbowych.
Zmienna a, wskazuje na pudełko w pamięci przechowujące liczbę całkowitą typu integer. Możemy sprawdzić tzw. adres „tego pudełka” w pamięci używając na zmiennej a, funkcji id. Oczywiście to co zwróci funkcja id musimy wydrukować za pomocą funkcji print, bowiem sama funkcja id nie drukuje na ekran efektu swojego działania.
Na ekranie otrzymamy następujący rezultat (w terminalu):
Mamy także zmienne typu float, czyli wspomniane liczby zmiennoprzecinkowe.
Po uruchomieniu skryptu, widzimy różnicę jak na dłoni:
W programowaniu nie możemy „na oko” określać typów, musimy mieć 100% pewności, co ma jaki typ. Możemy do sprawdzenia tego, wykorzystać funkcję sprawdzającą typy obiektów, czyli type(). Tutaj także potrzebujemy funkcji drukującej efekt działań, gdyś zadaniem funkcji type() jest jedynie sprawdzenie typu – nie wydrukowanie tego sprawdzenia.
Jeśli w kodzie naszego skryptu, usuniemy przykładowo z float część po przecinku, to oczywiście otrzymamy zwykłą liczbę typu całkowitego.
Właśnie doświadczyliśmy dynamicznego typowania – dlatego mówimy, że typ zmiennej nie jest uzależniony od jakiejś jednoznacznej deklaracji, tylko od typu wartości, na jaką dana zmienna wskazuje. Innymi słowy, zależy jakiego typu wartość jest przechowywania w obiekcie, na jaki wskazuje zmienna.
Czy typ jest odpowiedni?
Na koniec, mamy w Pythonie jeszcze jedną ciekawą funkcję. Mianowicie taką, która pozwala nam sprawdzić czy coś jest takim typem, jakiego byśmy chcieli, a jest to funkcja isinstance(zmienna, typ spodziewany). Przyjmuje ona dwa wymienione parametry: zmienna – czyli po prostu zmienna jaką chcemy sprawdzić i typ spodziewany – czyli typ zmiennej, którego powinna być sprawdzana zmienna. Innymi słowy, pytamy „czy zmienna nazwa_zmiennej, jest typu typ_spodziewany? Przykładowo, ja zapytam „czy zmienna b jest typu float?” i „czy zmienna a jest typu int?”. Jako odpowiedź dostanę prawda (True) lub fałsz (false), zobaczmy:
I uzykujemy odpowiedzi: Czy a jest intem? Prawda i czy b jest floatem? Prawda
Na tym, na razie, zakończymy naszą przygodę z typami. Zapraszam za tydzień, do dalszej, wspólnej nauki języka programowania Python!
3 komentarze do “Myśląc o Pythonie: Liczby int i float”