Zmienne

Posted on 2019-02-16

W tym miescu, chciałbym się skupić na podstawowych elementach programu - zmiennych. Co to jest? Czy każdą zmienną można zmienić? Postaram się oswoić zagadnienie.

Co to jest zmienna?

Zmienna ma nazwę i wskazuje na coś, albo na nic... Nie brzmi to dobrze, ale od czegoś trzeba zacząć.

Nazwa zmiennej

Komputer analizuje znak po znaku, więc żeby mu się liczby z nazwami nie myliły - nazwa zmiennej nie może się zaczynać od liczby. Podobnie ze znakami działań - ma być jednoznacznie, a*b jako nazwa, czy może zmienna a*b? W skrócie - Pierwszym znakiem nazwy ma być litera, dalej mają być litery, albo cyfry. Dostępny jest też under-score.

Wielkość znaków ma znaczenie - czyli zmienna A i a to dwie różne zmienne. Tu pojawiają się pewne konwencje. Jeżeli coś jest wartością stałą, nie będziemy tego zmieniać - nazwa nie powinna zawierać małych liter. Jeżeli nazwa zmiennej składa się z kilku członów - oddzielamy je under-score, wszystkie litery - małe. Takie proste zasady pozwalają na poprawę czytelności. Łatwiej się zorientować o co chodzi w programie.

Tworzenie zmiennej

Zmienną tworzy się za pomocą instrukcji przypisania - pojedynczy znak równa się. Python ustali, czy taka zmienna istnieje - jak tak to nadpisze jej wartość nową, jeżeli nie stworzy nową zmienną. Następnie zostanie wykonane to wszystko, co jest po prawej stronie znaku równasię, a wynik zostanie przypisany do zmiennej. Dokładniej to trafi do pamięci a zmienna będzie wskazywać na o miejsce. Przyłady zmiennych a, b i c:

a = 8
b = 10 - a
c = a * b

Przykłady zmiennych z ciągami znaków:

a = "ma kota"
b = "Ala"
c = b + " " + a

Jak można na nic nie wskazywać?

W pierwszym paragrafie napisałem, że zmienna może na nic nie wskazywać. W brew pozorom to jest dość wygodna koncepcja. Deklarujemy zmienną, bo wiemy, że będzie potrzebna, ale na starcie nie wiemy co powinna zawierać. Inna sytuacja, gdzie taka koncepcja może się przydać to nie znalezienie tego, czego szukamy. W kodzie programu z meetupu, zakładamy, że szukanie bramki z wygraną zawsze zakończy się powodzeniem. Co jednak, jeżeli mamy inny problem i tam już takiej pewności nie ma? Wtedy można zwrócić brak. Bazy danych mają NULL, Python ma None. Tu ważna uwaga. Sporo osób uważa, że wprowadzenie takiej koncepcji to zło, bo tak robiąc, za każdym razem musimy sprawdzić, czy to, co nam zwróciła funkcja to jest coś, z czym można pracować, czy None. Jak zapomnimy dodać takiego zabezpieczenia może się okazać, że w testach działa, ale później, na realnych danych - jest błąd.

Typ zmiennej

Skoro już coś tam jest, to ma typ. Typ zmiennej to informacja co z nią można zrobić, co zawiera. Są typy proste jak liczba całkowita, albo ciąg znaków. W Pythonie 3 są 3 rodzaje liczb:

  • int - liczaba całkowita,
  • float - liczba zmiennopozycyjna,
  • complex - liczba zespolona.

Jeżeli chcemy zadeklarować liczbę zmiennopozycyjną - trzeba podać część dziesiętną - z kropką:

a = 10 # liczba całkowita
b = 10.0 # liczba ułamkowa

Wszystko po znaku hash jest ignorowane przez Pythona - to jest tzw. komentarz - można w ten sposób zostawić sobie, albo komuś wskazówki, albo "wykomentować" kawałek kodu. Nie jest to polecane, ale... czasem chcemy coś sprawdzić i żeby za każdym razem nie przepisywać - można sobie zostawić "wskazówkę".

Wracając do liczb. Zamienić liczbę całkowitą na ułamkową można na 2 sposoby. Pomnożyć przez jeden, ale zmiennopozycyjny, albo użyć funkcji float():

a = 10
b = 1.0 * a
c = float(a)

Operacja odwrotna wymaga zaokrąglenia - funkcja round():

a = 10.1232131321313
b = round(a)
type(b)

Jak widać można sprawdzić typ zmiennej - funkcja type().

Objekty

Można też deklarować własne typy. Oprogramowując sterowanie grzejnikami w domu można stworzyć własny typ odpowiadający głowicy grzejnikowej. Mając taki typ, można tworzyć zmienne tego typu. Wtedy obsługa zmiany temperatury na głowicy jest w jednym miejscu, w typie. Takie podejście nazywa się programowaniem obiektowym. Modelujemy problem za pomocą objetów - jak głowica, albo klimatyzator, które są opisane przez nasze własne typy. Sami piszemy operacje dla tych typów, pełna kontrola - nad światem.

Kasowanie

Tu Python wyróżnia się na tle innych języków programowania - zmienne można kasować. Do tego służy operacja del:

a = 10.1232131321313
b = round(a)
del b
type(b)

Jak wykonałem powyższy kod interpreter napisał, że nazwa b nie jest zdefiniowana. Pewnie tak się stało, bo ją linijkę wcześniej skasowałem. Grunt, że działa.

Gdzie są trzymane nazwy

Nazwy są trzymane w przestrzeni nazw. To osobny temat.

Co jeszcze można nazwać

W zasadzie wszystko, do czego chcemy się odwołać musi mieć nazwę. Więc na jakiś etapie zostało nazwane. Funkcje mają nazwy, tak samo klasy, operacje wykonywane na obiektach klas - też potrzebują nazw - inaczej nie dałoby się wskazać co ma być zrobione.