article banner (priority)

Zmienne w Pythonie

Poznaliśmy już kilka typów wartości oraz operacje, które można między nimi wykonywać. Możesz się zastanawiać, po co nam one. Po co mamy pisać "Witaj, " + "Michał", jeśli moglibyśmy od razu napisać "Witaj, Michał"? Wynika to z tego, że zazwyczaj różne części pochodzą z różnych miejsc. Na przykład powitanie mogłoby wyglądać "Witaj, " + user_name, gdzie user_name będzie wskazywało na imię, które użytkownik podał w innym miejscu. Tutaj user_name to zmienna. Czyli co? Dowiesz się tego w tym rozdziale.

Definiowanie zmiennych

Aby utworzyć zmienną w Pythonie, wystarczy podać jej nazwę, użyć znaku przypisania = (a więc pojedynczy znak równości) i po jego prawej stronie określić wartość tej zmiennej.

a = 10
print(a)  # 10
b = "Witaj"
print(a)  # 10
print(b)  # Witaj

Znak przypisania zmiennej = ma niewiele wspólnego z omawianym wcześniej operatorem porównania ==. Nie powinny być one mylone. == porównuje dwie wartości i zwraca True lub False. = przypisuje wartość do zmiennej.

Wartość zmiennej można zmienić w ten sam sposób, w jaki została ona zdefiniowana.

x = 1
print(x)  # 1
x = 2
print(x)  # 2

Ćwiczenie: Definiowanie zmiennych 1

Uzupełnij brakujące fragmenty:

name = _______
print(name)  # Michał
name = "Marcin"
print(name)  # _______
points = _______
print(points)  # 123

Odpowiedzi na końcu książki.

Ćwiczenie: Definiowanie zmiennych 2

Zdefiniuj zmienną o nazwie num i przypisz do niej wartość 10. Wyświetl tę wartość przy użyciu funkcji print. Następnie przypisz do wartości num wartość 20 i ponownie wyświetl tę wartość.

Odpowiedzi na końcu książki.

Nazywanie zmiennych

Przy nazywaniu zmiennych możemy wykorzystywać małe i duże znaki, cyfry oraz znak podkreślenia _. Nie jest jednak dozwolone, by zacząć nazwę od cyfry.

Funkcjonują różne konwencje nazywania zmiennych, ale za dobrą praktykę uznaje się stosowanie snake_case, w której nazwy definiujemy przy użyciu małych liter, a słowa oddzielamy znakiem podkreślenia _. Gdy mamy kilka zmiennych o podobnym znaczeniu, na końcu dostawiamy liczby (na przykład name1, name2).

W programowaniu używamy nazw anglojęzycznych. Czasem tylko robimy wyjątki dla nazw własnych. Używanie polskich słów w nazwach zmiennych może być akceptowalne na kursach od podstaw, ale w komercyjnych projektach uważane jest za bardzo nieelegancką praktykę.

Gdy nazywamy zmienną, na początek polecam:

  • zastanowić się na co będzie ona wskazywała (załóżmy, że potrzebujemy zmiennej przechowującej adres zdjęcia użytkownika),
  • wyrazić to możliwie krótko w języku angielskim (w naszym przykładzie mogłoby to być "user image url"),
  • zapisać to w notacji snake_case (w naszym przykładzie będzie to "user_image_url").

Oto kilka przykładów poprawnie nazwanych zmiennych:

  • user_name
  • is_tea_time
  • user_group_key
  • user1, user2

A oto kilka przykładów nie najlepiej nazwanych zmiennych:

  • bookscollection - jest niepoprawne, ponieważ collection to osobne słowo i powinno być oddzielone znakiem podkreślenia _ albo zaczynać się wielką literą (lepsza wersja to books_collection),
  • 1book - jest niepoprawne, ponieważ liczba nie może się znajdować na pierwszej pozycji (lepsza wersja to one_book),
  • lista_książek - jest niepoprawne, ponieważ powinniśmy nazywać zmienne po angielsku (lepsza wersja to books_list albo books).

W kolejnych częściach książki zobaczysz jeszcze wiele przykładów poprawnie nazwanych zmiennych. Zwróć na nie uwagę.

Ćwiczenie: Nazywanie zmiennych

Jak myślisz, które z poniższych zmiennych mają dobre nazwy?

  • public_workshops
  • 1_way_ticket
  • arbitrary_user
  • note_type
  • user_Maciek
  • post_user_request
  • szkolenie_warszawa

Odpowiedzi na końcu książki.

Przypisanie rozszerzające wartość zmiennej

W programowaniu nierzadko zdarza się sytuacja, gdy zamiast całkowicie zmieniać wartość zmiennej, potrzebujemy jedynie coś do niej dodać lub odjąć. Dla przykładu: moglibyśmy dopisywać kolejne produkty do listy zakupów albo dodać nową wartość do sumy.

Aby dodać coś do już istniejącej zmiennej, wystarczy ustawić ją na sumę wartości aktualnej i tej, którą chcemy dodać.

cart_list = ""

cart_list = cart_list + "Truskawka, "
# "" + "Truskawka, " daje "Truskawka, "
print(cart_list)  # "Truskawka, "

cart_list = cart_list + "Gruszka, "
# "Truskawka, " + "Gruszka, " 
# daje "Truskawka, Gruszka, "
print(cart_list)  # "Truskawka, Gruszka, "

cart_list = cart_list + "Pomidor"
# "Truskawka, Gruszka, " + "Pomidor" daje  
# "Truskawka, Gruszka, Pomidor"
print(cart_list)  # "Truskawka, Gruszka, Pomidor"

num = 0

num = num + 1  # 0 + 1 daje 1
print(num)  # 1

num = num + 2  # 1 + 2 daje 3
print(num)  # 3

num = num + 3  # 3 + 3 daje 6
print(num)  # 6

Ponieważ taki sposób modyfikowania wartości jest bardzo popularny, powstał skrócony zapis. Zamiast pisać x = x + y, możemy użyć operatora += i napisać x += y.

cart_list = ""

cart_list += "Truskawka, "
# "" + "Truskawka, " 
# daje "Truskawka, "
print(cart_list)  # "Truskawka, "

cart_list += "Gruszka, "
# "Truskawka, " + "Gruszka, " 
# daje "Truskawka, Gruszka, "
print(cart_list)  # "Truskawka, Gruszka, "

cart_list += "Pomidor"
# "Truskawka, Gruszka, " + "Pomidor" 
# daje "Truskawka, Gruszka, Pomidor"
print(cart_list)
# "Truskawka, Gruszka, Pomidor"
num = 0

num += 1
print(num)  # 1

num += 2
print(num)  # 3

num += 3
print(num)  # 6

W przypadku liczb przydatne jest również odejmowanie wartości. Tutaj pomaga operator -=. Użycie x -= y jest ekwiwalentem x = x - y.

num = 10

num -= 1
print(num)  # 9

num -= 2
print(num)  # 7

num -= 3
print(num)  # 4

Inne operacje matematyczne również można tak skrócić. Zamiast x = x * y, piszemy x *= y. Zamiast x = x % y, piszemy x %= y itp.

a = 10
a *= 3
print(a)  # 30
a %= 4
print(a)  # 2

Ćwiczenie: Dodawanie i odejmowanie od wartości zmiennych

Uzupełnij brakujące fragmenty:

fruits = "Figa "
price = 0

fruits __ "Gruszka "
price __ 3.2

print(fruits)  # Figa Gruszka
print(price)  # 3.2

fruits += ________
price += ____

print(fruits)  # Figa Gruszka Banan
print(price)  # 6.0

# Stosujemy kupon zniżkowy
price __ 1.4

print(price)  # 4.6

Odpowiedzi na końcu książki.

Zmienne wskazują na wartości

Zmienna przypomina kartkę z numerem schowka, w którym znajduje się wartość. Gdy interpreter widzi wyrażenie "Witaj, " + user_name, to chciałby po obu stronach plusa mieć wartości, ale zamiast jednej z nich znajduje zmienną. Ta zmienna zawiera w sobie adres, pod którym poszukiwana wartość się znajduje. Interpreter więc sięga tam i znajduje poszukiwaną nazwę użytkownika. Dlatego mówię, że zmienne nie zawierają wartości, a raczej na nie wskazują.

Załóżmy, że kiedy pytamy o wartość user_name, ta wskazuje na "Michał". Kiedy ustawimy, by wskazywała na "Marcin", to poprzednia wartość jest zapominana. Gdy wówczas zapytamy o wartość user_name, dostaniemy wartość, na którą aktualnie ona wskazuje, czyli "Marcin".

user_name = "Michał"
print(user_name)  # Michał

user_name = "Marcin"
print(user_name)  # Marcin

Ta subtelna metafora pomaga w bardziej skomplikowanych zastosowaniach zmiennych. Co zrobić w sytuacji, gdy do zmiennej przypiszemy wartość innej zmiennej? Warto pamiętać, że zmienne wskazują na wartości, a nie na inne zmienne. Poniższy problem często myli nawet doświadczonych programistów, co bywa źródłem poważnych błędów w aplikacjach. Stanie się to jednak jasne, gdy pojmiemy metaforę wskazywania na wartości, która wiernie oddaje, jak naprawdę działają zmienne.

a = 10
b = a
a = 20
print(b)  # 10,
# ponieważ b wskazuje na wartość 10, a nie na zmienną
print(a)  # 20

Przedstawiony tutaj obraz nieco się skomplikuje, gdy wprowadzimy wartości mutowane. Będzie to omówione w dalszej części.

f-stringi

Często jest tak, że wartość zmiennej chcemy wstawić do wartości tekstowej. Jeśli zmienna zawiera również wartość typu string, to wartości te możemy dodać przy pomocy plusa.

name = "Ala"
print("Imię to " + name)  # Imię to Ala

Jeśli jednak zmienna zawiera wartość innego typu, na przykład int, to przed dodaniem konieczna jest zamiana na stringa. Możemy jej dokonać przy użyciu str, jak na poniższym przykładzie.

value = 1234
print("Wartość to " + str(value))  # Wartość to 1234

Istnieje jednak łatwiejsza metoda. Ponieważ wyjątkowo często przydatne jest umieszczanie wartości zmiennych w tekście, powstał specjalny zapis dla stringów (został on wprowadzony w wersji 3.6). Charakteryzuje się tym, że przed cudzysłowem zaczynającym stringa stawiamy literę "f". Gdy tak zrobimy, w obrębie wartości tekstowej możemy umieścić otoczoną nawiasami klamrowymi nazwę zmiennej, a w jej miejscu zostanie umieszczona wartość tej zmiennej zamieniona na stringa.

value = 1234
print(f"Wartość to {value}")  # Wartość to 1234

Tak zapisane wartości tekstowe znane są jako f-stringi. Jest to bardzo popularny zapis, z którym spotkamy się jeszcze wiele razy w dalszych częściach tej książki.

a = "A"
b = "B"
print(f"a = {a}, b = {b}")  # a = A, b = B

Przypisanie wartości wielu zmiennych

W języku Python możliwe jest przypisanie wartości do wielu zmiennych jednocześnie. Przykładowo, jeśli chcielibyśmy, aby zarówno a jak i b były równe 1, możemy to zrobić poprzez dwa przypisania, ale możemy również to określić poprzez a = b = 1.

a = b = 1
print(a)  # 1
print(b)  # 1

# alternatywa do 
a = 1
b = 1
print(a)  # 1
print(b)  # 1

Jeśli chcielibyśmy określić różne wartości dla ab, to również można to zrobić w jednej linii. W takim przypadku najpierw określamy zmienne, do jakich chcemy przypisać wartości (oddzielamy je przecinkami), stawiamy znak równości i określamy kolejno ich wartości.

a, b = 1, 2
print(a)  # 1
print(b)  # 2

# alternatywa do 
a = 1
b = 2
print(a)  # 1
print(b)  # 2

Jednym z zastosowań tego zapisu jest zamiana wartości, tak by a dostało wartość b, a b wartość a.

a, b = 1, 2
print(a)  # 1
print(b)  # 2

a, b = b, a
print(a)  # 2
print(b)  # 1

Wartość specjalna None

Istnieje specjalna wartość None, która symbolizuje brak wartości. Często ustawia się ją jako wartość nowo powstałej zmiennej, gdy chcemy zdefiniować zmienną, ale nie mamy dla niej jeszcze żadnej wartości. None używamy także, by pozbyć się wartości zmiennej. Praktyczne przykłady zobaczymy w dalszej części książki.

name = None
print(name)  # None

name = "Marcin"
print(name)  # Marcin

name = None
print(name)  # None

Uwaga! W programowaniu wielkość liter jest bardzo istotna. Zauważ, że None zaczyna się wielką literą. Zawsze zwracaj uwagę na wielkość znaków w kodzie.

Aby sprawdzić, czy zmienna zawiera wartość None standardowo używa się is None zamiast == None.

name = None
print(name is None)  # True

name = "Marcin"
print(name is None)  # False

name = None
print(name is None)  # True

Słowo kluczowe is sprawdza, czy po obu stronach znajduje się dokładnie ten sam obiekt, a więc nie wykorzystuje metody __eq__, którą omówimy w dalszej części książki.

Ćwiczenie: None

Uzupełnij brakujące fragmenty:

name = ____
surname = "Michalski"

print(name is None)  # ____
print(name)  # None
print(surname)  # Michalski

name = surname
surname = "Gajos"

print(name is None)  # ____
print(name)  # ______
print(surname)  # ________

Odpowiedzi na końcu książki.