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 zwracaTrue
lubFalse
.=
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 tobooks_collection
),1book
- jest niepoprawne, ponieważ liczba nie może się znajdować na pierwszej pozycji (lepsza wersja toone_book
),lista_książek
- jest niepoprawne, ponieważ powinniśmy nazywać zmienne po angielsku (lepsza wersja tobooks_list
albobooks
).
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 a
i b
, 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.