article banner (priority)

Wartości w Pythonie

W poprzednim rozdziale nauczyliśmy się jak napisać kod Python, wypisujący tekst "Witaj, Świecie":

print("Witaj, Świecie")  # Witaj, Świecie

Kiedy na niego patrzysz, być może zastanawiasz się, dlaczego wygląda on tak, a nie inaczej. Czym jest print? Czemu tekst Witaj, Świecie jest w cudzysłowie? Wszystko z czasem się wyjaśni. print poznamy lepiej przy okazji funkcji. Teraz zaś pomówmy o wartości "Witaj, Świecie".

Teksty, znane jako stringi

Cudzysłowy służą do określenia wartości tekstowej. Gdy czytasz książkę fabularną, cudzysłowy często określają, co dosłownie pomyślał bohater. Podobnie jest w programowaniu, oznaczają dokładną wartość tekstową.

# Język pisany
Wypisz "Witaj, Świecie"

# Python
print("Witaj, Świecie")  # Witaj, Świecie

Tekst w cudzysłowie nie zostanie zinterpretowany, czyli nawet gdyby zawierał instrukcję, nie zostanie ona wykonana. Jest wartością zawierającą tekst znak po znaku. Z taką wartością możemy coś zrobić, na przykład przekazać ją do print. Choć raczej nie ma to sensu, równie dobrze moglibyśmy też nic z nią nie robić.

print(10)  # 10

# Powstanie wartość i nic się z nią nie stanie
"print(10)"

print("print(10)")  # print(10)

Stringi?

Wartości tekstowe w programowaniu są zwykle nazywane stringami. Wzięło się to od angielskiego słowa "string", oznaczającego sznur lub strunę. Trochę przypominają sznur znaków: mogą mieć rozmaite długości, można je łączyć albo przycinać, można nawet wyciąć ze środka mały kawałek. Ta nazwa już się utarła i jest standardem w niemal wszystkich językach programowania. Programiści zaczęli używać tego pojęcia także w języku mówionym. Czasem stosuje się spolszczenie "ciąg znaków" albo "łańcuchy znaków", ale rzadko kiedy ktoś tak mówi. Programiści mówią "stringi"1, a że celem tej książki jest uczenie wiedzy praktycznej, więc i ja nie będę się wyłamywał od takiej nomenklatury.

Cudzysłowy

W języku Python stringi można tworzyć przy użyciu cudzysłowu podwójnego " lub pojedynczego '.

Nie ma istotnych różnic między nimi. Są tylko pewne konwencje, które sprawiają, że w jednych przypadkach programiści preferują jedne, a w innych drugie. W książce zdecydowałem się na użycie podwójnego cudzysłowu ", który uważam za bardziej intuicyjny dla nas, Polaków.

print("Witaj, Świecie")  # Witaj, Świecie
print('Witaj, Świecie')  # Witaj, Świecie

Wiedza o różnych cudzysłowach może się przydać, gdy potrzebujesz uzyskać tekst z cudzysłowem. Jeśli chcesz wyświetlić w tekście pojedynczy cudzysłów, otocz tekst podwójnymi. Jeśli podwójny, otocz pojedynczymi.

print("Let's play")  # Let's play
print('Powiedział "Hej"')  # Powiedział "Hej"

Tekst otoczony jednym cudzysłowem musi znajdować się w jednej linii. Jeśli chcielibyśmy, by zawierał on kilka linii, to oddzielamy je znakiem "\n". Można powiedzieć, że oznacza on "Enter".

text = "Line 1,\nLine2"
print(text)

# Wypisze:
# Line 1
# Line 2

Tekst możemy także otoczyć trzema cudzysłowami (pojedynczymi lub podwójnymi). Wtedy może on mieć wiele linii.

text = """Line 1, 
Line 2"""
print(text)

# Wypisze:
# Line 1
# Line 2

Dodawanie tekstów

W języku pisanym możemy łączyć ze sobą cytaty. Moglibyśmy na przykład powiedzieć:

# Język pisany
Wypisz "Witaj, " oraz "Świecie"

W programowaniu wartości "Witaj, " oraz "Świecie" możemy połączyć w jedną przy użyciu znaku dodawania +, który postawiony pomiędzy dwoma stringami utworzy ich połączenie:

print("Witaj, " + "Świecie")  # Witaj, Świecie

Ćwiczenie: Stringi

Co zostanie wypisane w poniższym kodzie?

print('Kim jest "ona"?')
print("Użyję " + " by dodać teksty")
print("Tekst," + "następny," + "jeszcze jeden")

Odpowiedzi na końcu książki.

Liczby

Liczba również jest wartością. W Python operujemy na liczbach całkowitych (np. 23) oraz rzeczywistych (np. 23.5). Wszystkie liczby mogą być ujemne (z minusem przed liczbą). Zauważ, że część dziesiętna w przypadku liczb rzeczywistych zapisywana jest po kropce, czyli według zasad języka angielskiego (np. 3.14, a nie 3,14).

# Liczby całkowite
print(42)  # 42
print(-1)  # -1
# Liczby rzeczywiste
print(2.71)  # 2.71
print(-3.14)  # -3.14

Na liczbach możemy wykonywać operacje matematyczne. Python wspiera wiele operacji, które część czytelników może pamiętać jeszcze ze szkoły:

  • Dodawanie +
  • Odejmowanie -
  • Mnożenie *
  • Dzielenie /
  • Dzielenie bez reszty //
  • Reszta z dzielenia %
  • Podnoszenie do potęgi **
# Dodawanie
print(3 + 2)  # 5
print(10 + 8)  # 18
print(2 + 4)  # 6

# Odejmowanie
print(3 - 2)  # 1
print(10 - 8)  # 2
print(2 - 4)  # -2

# Mnożenie
print(3 * 2)  # 6
print(10 * 8)  # 80
print(2 * 4)  # 8

# Dzielenie
print(3 / 2)  # 1.5
print(10 / 8)  # 1.25
print(2 / 4)  # 0.5

# Dzielenie bez reszty
print(3 // 2)  # 1
print(10 // 8)  # 1
print(2 // 4)  # 0

# Reszta z dzielenia
print(3 % 2)  # 1
print(10 % 8)  # 2
print(2 % 4)  # 2

# Podnoszenie do potęgi
print(3 ** 2)  # 9
print(10 ** 8)  # 100000000
print(2 ** 4)  # 16

Co ważne, jeśli wykonamy operację między dwoma liczbami całkowitymi, wynik również będzie liczbą całkowitą. Jeśli natomiast jedna z tych liczb będzie miała wartość dziesiętną, a więc będzie liczbą rzeczywistą, to wynik również będzie liczbą rzeczywistą.

print(2 + 3)  # 5
print(2 + 3.0)  # 5.0
print(2.0 + 3)  # 5.0
print(2.0 + 3.0)  # 5.0

Pythona można wykorzystywać jako kalkulator, nawet do obliczania wyników złożonych operacji. Domyślnie zachowana jest matematyczna kolejność działań, można również stosować nawiasy.

print(1 + 2 * 3)  # 7 
# (mnożenie wykonywane jest przed dodawaniem)

print(1 + (2 * 3))  # 7
print((1 + 2) * 3)  # 9

print(1 ** 2 + 2 ** 2 + 3 ** 2 + 4 ** 2)  # 30
print(1 * 2 * 3 * 4 * 5)  # 120
print(1 * 2 + 3 * 4 + 5 * 6)  # 44

Tutaj warto sięgnąć pamięcią do poprzedniego rozdziału, gdzie uczyliśmy się jak używać REPL. Niejednokrotnie używałem go jak kalkulatora.

Ćwiczenie: Python jako kalkulator

Użyj Python REPL aby ustalić, ile to jest:

  • 1 * 2 + 3 * 4 + 5 * 6 + 7 * 8 + 9
  • 1 * (2 + 3) * (4 + 5) * (6 + 7) * (8 + 9) (Czy wartość ta będzie się różniła od powyższej?)
  • 1 * 2 / 3 * 4 / 5 * 6 / 7 * 8 / 9 * 10 (Czy wartość ta będzie większa niż 1?)
  • 2102^{10} (Czy spodziewasz się, że wartość ta będzie większa, czy mniejsza niż 1000?)

Odpowiedzi na końcu książki.

Wartości logiczne

Kolejnym istotnym typem wartości są wartości logiczne, czyli prawda True oraz fałsz False.

print(True)  # True
print(False)  # False

Są one przydatne w wielu przypadkach. Na przykład mogą określać, czy użytkownik wyraził zgodę na zbieranie danych (True) czy nie (False). W rozdziale o warunkach przekonamy się, że mogą one decydować, czy jakiś fragment kodu powinien zostać wywołany. Wartości logiczne są bardzo przydatne i istotne, tylko skąd się biorą?

Operator równości i nierówności

Wartości logiczne najczęściej powstają w wyniku porównywania dwóch wartości. Używamy do tego operatora == (podwójny znak równości), który zwraca True gdy wartości są sobie równe, oraz False gdy nie są. Zadziała on dla znanych nam już liczb i stringów.

print(1 == 1)  # True
print(1 == 2)  # False

print("Marcin" == "Marcin")  # True
print("Marcin" == "Maciek")  # False

Uwaga! Operator ==, oznaczający porównanie, nie powinien być mylony z =, który opiszemy w dalszej części książki, a oznacza przypisanie wartości.

Jest także operator != sprawdzający, czy wartości są różne. W praktyce zwracana przez niego wartość logiczna jest zawsze odwrotna do tej zwracanej przez == (czyli jeśli == zwróciłby True, to != zwróci False, a jeśli == zwróciłby False, to != zwróci True).

print(1 != 1)  # False
print(1 != 2)  # True

print("Marcin" != "Marcin")  # False
print("Marcin" != "Maciek")  # True

Te operatory można łączyć z innymi poznanymi operacjami:

print("Witaj, " + "Świecie" == "Witaj, Świecie")  # True
print(1 + 2 == 3)  # True
print(1 + 2 != 3)  # False

Warto zauważyć, że powyższy kod działa poprawnie dzięki kolejności działań. Porównywanie ==!= jest wykonywane po operatorach arytmetycznych. By obliczyć 3 == 1 + 2, w pierwszej kolejności wykonywana jest operacja dodawania 1 + 2, a dopiero potem porównanie 3 == 3, zwracające wynik True.

Warto wiedzieć, że znak równości w programowaniu ma znaczenie nieco inne, niż znak równości w szkolnej matematyce. Gdy na matematyce widzieliśmy x * 2 = 4 to zakładaliśmy, że to równanie musi być spełnione, więc x musi być równy 2. W programowaniu sprawdzamy, czy jest spełnione, czy nie. x może być na przykład równy 3 i wtedy równanie x * 2 == 4 zwróci False.

Operatory porównania dla liczb

Czasem może wystąpić potrzeba sprawdzenia, czy jedna wartość jest większa od drugiej. Do tego wykorzystujemy operatory porównania2:

  • > sprawdzający, czy to, co jest po lewej stronie, jest większe od tego, co jest po prawej,
  • < sprawdzający, czy to, co jest po lewej stronie, jest mniejsze od tego, co jest po prawej,
  • >= sprawdzający, czy to, co jest po lewej stronie, jest większe lub równe od tego, co jest po prawej,
  • <= sprawdzający, czy to, co jest po lewej stronie, jest mniejsze lub równe od tego, co jest po prawej.
print(1 > 3)  # False
print(1 < 3)  # True

print(2 > 3)  # False
print(3 > 3)  # False
print(4 > 3)  # True

print(2 < 3)  # True
print(3 < 3)  # False
print(4 < 3)  # False

print(2 >= 3)  # False
print(3 >= 3)  # True
print(4 >= 3)  # True

print(2 <= 3)  # True
print(3 <= 3)  # True
print(4 <= 3)  # False

Ćwiczenie: Python jako kalkulator porównujący

Użyj Python, by sprawdzić, co jest większe:

  • 1 * 2 + 3 * 4 + 5 czy 1 + 2 * 3 + 4 * 5?
  • 2202^{20} czy 3153^{15}?
  • 2152^{15} czy 10410^4?

Odpowiedzi na końcu książki.

Typy wartości

Na przestrzeni tego rozdziału omówiliśmy kilka podstawowych typów wartości. Poznaliśmy liczby całkowite i rzeczywiste, stringi, wartości logiczne. Każdy z tych typów jest jakby z innego świata, mówiąc językiem matematyki "z innej przestrzeni". W programowaniu każda wartość ma swój typ, który określa z jakiej przestrzeni są dane wartości. Mają one swoje nazwy:

  • Stringi (teksty) są typu str3.
  • Liczby całkowite (bez wartości dziesiętnej) są typu int4.
  • Liczby rzeczywiste (z wartością dziesiętną) są typu float5.
  • Wartości logiczne (True i False) są typu bool6.

Typ określonej wartości można sprawdzić przy użyciu funkcji type:

print(type(""))  # <type 'str'>
print(type("Some text"))  # <type 'str'>
print(type("Text " + "another"))  # <type 'str'>
print(type(10))  # <type 'int'>
print(type(0))  # <type 'int'>
print(type(-10))  # <type 'int'>
print(type(0.1))  # <type 'float'>
print(type(3.14))  # <type 'float'>
print(type(42.0))  # <type 'float'>
print(type(True))  # <type 'bool'>
print(type(False))  # <type 'bool'>
print(type((1 > 2)))  # <type 'bool'>

Poza nimi Python wspiera także wiele innych typów, jak również można definiować własne. Przekonamy się o tym w dalszych częściach książki.

Spokojnie, wszystko po kolei. W następnych rozdziałach poznamy wymienione typy wartości i przekonamy się, jak wykorzystuje się je w programowaniu. Poznając kolejne bloki, będziemy umieć coraz więcej z nimi zrobić, a na koniec wykorzystamy je, by napisać własną grę. Gotowi? To ruszamy! Czas poznać zmienne.

1:

Językoznawcy często nie są zadowoleni z tego stanu rzeczy, ale zauważyłem, że programiści cechują się wyjątkową obojętnością wobec zadowolenia językoznawców.

2:

Formalnie pojęcie operatora porównania obejmuje także ==!=. Nie znalazłem jednak słowa, które określałoby wyłącznie <, >, <=>=. Uniknąłem też pojęcia operatora nierówności, gdyż w programowaniu silnie kojarzy się z !=.

3:

str to skrót od "string".

4:

int to skrót od "integer", czyli po angielsku liczba całkowita.

5:

Nazwa "float" odnosi się do tego, jak w programowaniu kodowane są liczby rzeczywiste.

6:

Nazwa tego typu pochodzi od nazwiska matematyka George Boole’a, który wprowadził metody algebraiczne do logiki, tworząc tzw. algebrę Boole’a. Traktuje ona TrueFalse jako wartości oraz definiującą różne operacje, takie jak i, lub czy nie.