Dziś trochę nawiążemy do poprzedniego posta. Zajmiemy się bowiem, bardzo istotnymi koncepcjami, mającymi też co nieco wspólnego z naszym inputem. Będzie to coś, z czym do czynienia ma, praktycznie na co dzień, każdy programista – chodzi o typy wartości. Już wiemy, że mamy różne typy; mamy numbers, mamy string – w tych numbers mamy, na przykład: integer – liczby całkowite, ale mamy też float. I w momencie gdy tworzymy, nawet najprostszy, program, który otwarty jest na użytkownika – tzn. użytkownik może coś wprowadzać. No to już otwieramy furtkę, do niezliczonej ilości błędów. Błędów związanych z nieprawidłowym typem wartości. Pokażę to na pewnych przykładach, wprowadzając przy okazji ważną koncepcję konwersji między różnymi typami wartości.
Zaczniemy od prostego programu, gdzie wprowadzamy jakiś tekst, przypisujemy go do zmiennej a, którą później wyświetlamy. W takim programie możemy wprowadzić przykładowo cyfrę 2 i zobaczyć ją na ekranie. Nic spektakularnego.
Problem pojawia się, gdy chcemy na naszej dwójce wykonać jakieś operacje matematyczne. Gdybyśmy, przykładowo, na naszej cyfrze, chcieli użyć inkrementacji – czyli zwiększania o jeden…
…- otrzymamy „TypeError”.
Nasza cyfra bowiem, jak się okazuje, jest typem tekstowym string, a nie liczbowym, jak mogłoby się wydawać. Python mówi nam po prostu, że mamy nieprawidłowy typ wartości i nie da się naszej cyfry zinkrementować.
Wszystko wprowadzane za pomocą funkcji input(), jest wprowadzane jako string, a trudno podnieść wartość tekstową o jeden. Mamy tutaj fundamentalny problem nieprawidłowego typu na wejściu. Wartość na wejściu zawsze będzie stringiem i nie możemy wykonywać na niej operacji typowo matematycznych. I stąd właśnie ten nasz TypeError.
Problem ten możemy rozwiązać. Możemy to zrobić za pomocą, obecnych w Pythonie, funkcji do konwersji pomiędzy różnymi typami. Przykładowo, możemy wartość string przekonwertować na integer – właśnie coś takiego się nam teraz przyda.
Zastosujemy funkcję konwertującą na tym co zwrócił nam input, zrobimy to po prostu otaczając całego inputa funkcją int(). Popatrzmy jak to będzie wyglądać w kodzie.
Funkcja int() przyjmuje wartość wprowadzaną do input() jako parametr i zamienia na integer. Czyli funkcja input() zamienia wszystko co wprowadził użytkownik na string, a funkcja int(), zamienia to co dostała z input() na int, i takim oto sposobem mamy liczbę całkowitą, i zapisujemy ją do zmiennej a.
Skoro w zmiennej a siedzi teraz liczba, możemy ją bezpiecznie podnieść o jeden, bo jest to operacja typowo arytmetyczna, wykonywana właśnie na liczbach. Zatem gdy teraz wprowadzimy liczbę 2, nie powinniśmy otrzymać już żadnego błędu, i tak się rzeczywiście dzieje.
Mamy więc do czynienia z bardzo ważną koncepcją konwersji typu. Mamy na wejściu, w inpucie zawsze string – bo tak działa input w Pythonie – ale my ten string jednoznacznie konwertujemy na integer, po to by dało się na nim wykonać operację inkrementacji. I z czymś takim programując mamy bardzo często do czynienia, dlatego mówię, że jest to koncepcja ważna, bo i powszechnie używana.
Wszędzie tam, gdzie otwieramy się na jakieś wartości wprowadzane z zewnątrz, to musimy zadbać o to by były to wartości odpowiedniego typu. Musimy niejako czasem przekonwertować, albo sprawdzić czy ta wprowadzona na wejściu wartość jest rzeczywiście właściwego typu, bo jak widzieliśmy, kiedy ta wartość nie będzie właściwego typu. Niestety w naszym programie pojawią się błędy.
W powyższym programie, tak naprawdę, tylko częściowo rozwiązaliśmy problem, można by tutaj wymyślić całą masę scenariuszy, w których coś mogłoby pójść nie tak. Przykładowo, jeśli uruchomimy program i wprowadzimy wartość, która będzie miała miejsca po przecinku (w programowaniu po kropce), to dostaniemy kolejny błąd – jaki? Przekonaj się sam 😉 Podpowiem, że funkcja int() spodziewa się stringa, który jest właśnie int.
Mamy też inną funkcję, która zamiast na integer, pozwoliłaby przekonwertować wartość otrzymaną na float. Czyli funkcja float(), która też input przyjmie na swoim wejściu.
Sprawdź teraz co się stanie jak wprowadzisz liczbę 2.5 😉
Funkcja float, potrafi przekonwertować wartości zarówno typu int jak i float, na float. Float już można prawidłowo zwiększyć o jeden. Zwróćmy uwagę, że po konwersji tą funkcją, wynik zawsze będzie typu float, czyli z miejscami po przecinku, nawet jeśli na wejściu podaliśmy liczbę całkowitą.
Nie jest to temat łatwy, bowiem na każdym kroku gdzie otwieramy się na wprowadzanie jakiejś wartości, musimy się liczyć z ryzykiem wprowadzenia nieprawidłowej wartości lub nieprawidłowego typu wartości. Jest to rzecz, którą zawsze trzeba dobrze przemyśleć, trzeba się zastanowić jakie możliwe typy wartości mogą pojawić się na wejściu i co w takiej sytuacji zrobimy, czy będziemy dopuszczali wartości różnych typów, czy też będziemy je jednoznacznie konwertowali – takie rzeczy trzeba mieć zawsze po prostu na uwadze. Zawsze musimy się liczyć z tym, że wartości wprowadzone na wejściu mogą się okazać nieprawidłowego typu.