Zmienne i instrukcja przypisania
Literały i słowa zastrzeżone
W biologii i statystyce zmienne to wielkości mogące przyjmować różne wartości. Ich definicja obejmuje nazwę zmiennej (np. długość) i wartość pomiaru konkretnego obiektu (np. 33 cm). Natomiast wszelkie wzory i procedury, które mają jakieś znaczenie dla określonej zmiennej podawane są w taki sposób, że wartości zmiennej zastępowane są jakimś symbolem tekstowym. W informatyce to właśnie te symbole nazywane są zmiennymi.W Pythonie zmienna to symbol złożony z niektórych znaków wpisywanych z klawiatury, który może przyjmować dowolne wartości liczbowe, znakowe, tekstowe, listy, krotki, zbiory itd. Każdy język programowania pozwala na operowanie zmiennymi i ma pewne ograniczenia jeśli chodzi o nazwy, którymi nazywane są zmienne. Nazywa się je literałami. Poza tym są nazwy zastrzeżone, których nie można użyć jako literałów. W Pythonie nazwami zastrzeżonymi są:
and | as | assert | break | class | continue |
def | del | elif | else | except | finally |
for | from | global | if | import | in |
is | lambda | nonlocal | not | or | pass |
raise | return | try | with | while | yield |
False | True | None |
Służą one do pisania poleceń specjalnych oraz instrukcji.
W Pythonie literały powinny składać się z liter i cyfr oraz znaku podkreślenia. Powinny zaczynać się od litery lub ewentualnie znaku podkreślenia, co nie jest polecane. Nie mogą być wśród tych znaków spacje, zatem literał nie może składać się z dwóch słów. Nie ma natomiast ograniczenia na długość nazwy zmiennej. Literałom przypisuje się pewne wartości początkowe, a w trakcie działania programu można im zamienić tę wartość na inną. W Pythonie można w ten sposób także zmienić typ zmiennej.
Instrukcja przypisania
Przypisanie wartości danej nazwie wykonuje się za pomocą symbolu =, który w Pythonie nie może być działaniem porównującym wartości zmiennych (gdzie używa się dwuznaku == ). Literał powinien znajdować się po lewej stronie i nie powinny w nim występować działania, relacje oraz funkcje. Po prawej stronie mogą być różne dopuszczone przez składnię programu działania, metody lub funkcje. Mają one wyższy priorytet niż przypisanie wartości odpowiedniemu literałowi. Działanie instrukcji przypisania można prześledzić wykonując następujący program:
a=7 b=7 print(a,b) a=b==7 print(a) |
>>> 7 7 True |
Literały, którym można coś przypisać, mogą składać się z dowolnie wielu znaków, wśród których dopuszczalne są litery, cyfry oraz znak podkreślenia. Jednak każda nazwa zmiennej musi się zaczynać od litery lub od znaku podkreślenia ‘_’. Nie może zaczynać się od cyfry.
abcdefghijklmnoprstuwxyz=7 print(abcdefghijklmnoprstuwxyz, 2*abcdefghijklmnoprstuwxyz, 3*abcdefghijklmnoprstuwxyz) a_123=7 print(a_123,2*a_123, 3*a_123) _a=7 print(_a,_a*2, 3*_a) |
>>> 7 14 21 7 14 21 7 14 21 |
Pomimo, że nazwy zmiennych zaczynających się od znaku podkreślenia są akceptowane przez interpreter Pythona, mają jeszcze one inne znaczenie i lepiej takich nazw unikać.
Zmiennej może być przypisana wartość dowolnego wyrażenia wykonywanego przez Pythona.
import math a=7*math.log(0.14*math.pi) b=(3*a**2+18)/math.log(a+17) print(a,b) a=’kuku’+’ryku’ b=’kur’ in a print(a,b) |
>>> -5.7496807936640275 48.41210420824468 kukuryku True |
Możliwe jest przypisanie tej samej wartości początkowej kilku zmiennym. Poza tym możliwe jest przypisanie wielokrotne mające postać: nazwa1, nazwa2,…,nazwa_n=wartość1, wartość2,…,wartość_n. W ten sposób przypisywane są nazwom: nazwa_i wartości: wartość_i. Dzieje się to jednocześnie, co może być ważne wtedy, gdy wartość jednej zmiennej zmieniana jest przez wartość innej. Widać to w następujących programach
a,b=2,3 a,b,c=a+b,a*b,a**b print(a,b,c) |
a=2 b=3 a=a+b b=a*b c=a**b print(a,b,c) |
>>> 5 6 8 |
>>> 5 15 30517578125 |
Operację przypisania można wykonać z użyciem tej samej zmiennej nadając jej wartość zależną od wartości poprzedniej.
import math a=0 print(a) a=a+1 print(a) a=a+1 print(a) a=2 print(a) a=math.exp(a) print(a) a=math.exp(a) print(a) |
>>> 0 1 2 2 7.38905609893065 1618.1779919126539 |
Istniejącą zmienną można skasować instrukcją del. Próba jej użycia lub wyświetlenia skończy się wtedy komunikatem o błędzie.
a=100 b=a/2 print(a,b) del a b=a/2 |
>>> 100 50.0 Traceback (most recent call last): File “C:\Users\User\OneDrive\Pulpit\A.py”, line 5, in <module> b=a/2 NameError: name ‘a’ is not defined |
Zmienne trwają dopóki mamy uruchomionego Pythona. Znikają po jego zamknięciu. Dlatego tez należy zapamiętywać nie tylko wyniki programu, ale cały kod źródłowy, który generuje zmienne. W Thony uruchomienie programu zielonym trójkącikiem nie powoduje jego zapamiętania. Trzeba w tym celu kliknąć jeszcze na szarą ikonkę dyskietki 3.5 calowej, umiejscowioną obok zielonego trójkącika albo klikając Ctrl+s. Zależy to jeszcze czy uruchamiamy Thonnego, czy program xxxxx.py, nad którym pracujemy włączając Thonny’ego.
Nadawania wartości zmiennym po uruchomieniu programu
Bardzo często pisze się skrypty stosując zmienne, które dopiero po ich uruchomieniu zastępuje się wartościami. Służą do tego instrukcje input(). Wyglądają one następująco:
a=float(input(“podaj wartość dzielnej: “)) b=float(input(“podaj wartość dzielnika: “)) print(a/b) |
>>> podaj wartość dzielnej: 21 podaj wartość dzielnika: 5 4.2 |
Przypisanie wartości do zmiennej następuje po uruchomieniu skryptu w części wynikowej. Po wpisaniu liczby następuje wykonanie pozostałych części kodu.
Instrukcje input() często mylnie oznaczają typ zmiennych. W tym wypadku wskazanie, że zmienne są liczbami rzeczywistymi (liczba.zero lub float(liczba)) jest przydatne, a często konieczne.
Wczytywanie wartości zmiennych z pliku tekstowego
Innym sposobem nadawanie wartości zmiennym jest wczytywanie ich do programu z pliku tekstowego. Jeżeli w bieżącym katalogu znajduje się plik “dane.txt” wyglądający przykładowo tak:
to można go wczytać do programu w dwojaki sposób:
parametry = open(‘dane.txt’).read() print(parametry) |
parametry = open(‘dane.txt’) try: param1 = parametry.read() finally: parametry.close() print(param1) |
>>> 12.3 13.2, 18.4 0.1, 0.001 0.7, -0.003 |
>>> 12.3 13.2, 18.4 0.1, 0.001 0.7, -0.003 |
W obu przypadkach powstanie identyczny wydruk zawartości pliku. Jednak drugi sposób jest bezpieczniejszy, gdy chcemy wczytać dane na których nam zależy z niesprawdzonych plików, które mogą wygenerować błędy. Daje on gwarancję, że nie zniszczy się pliku tekstowego z danymi.
W przypadku plików znajdujących się w innym katalogu należy wpisać ich nazwę ze ścieżką dostępu.
Wczytane dane są traktowane jako długi tekst posiadający jednak znaki łamania wierszy. Często analizę takich danych rozpoczyna się od policzenia linijek we wczytanym pliku. Możemy także wczytać tylko określoną linię tekstu. Służą do tego następujące instrukcje:
liczbawierszy = len(open(‘dane.txt’).readlines()) print(liczbawierszy) |
import linecache wiersz1 = linecache.getline(‘dane.txt’, 1) print(wiersz1) |
>>> 4 |
>>> 12.3 |
Widać, że numeracja wierszy w tekście odbiega od numeracji elementów na listach. Pierwsza linijka ma numer 1 nie 0.
Fragmenty pliku tekstowego nawet wtedy gdy wyglądają jak liczby, zawsze są typu tekstowego. Dopiero po odpowiedniej transformacji mogą być używane do działań arytmetycznych.
import linecache wiersz1 = linecache.getline(‘dane.txt’, 1) liczba1 = float(wiersz1) print(liczba1, liczba1**2, liczba1**3) |
>>> 12.3 151.29000000000002 1860.8670000000004 |
Przy okazji widać wielkość błędu wykonywanych operacji.
Zapisywanie wyników do pliku tekstowego
Operacją odwrotną do czytania danych z pliku tekstowego i przypisywania ich zmiennym jest zapisanie wyników obliczeń do nowego pliku tekstowego. Najpierw trzeba utworzyć odpowiedni tekst z wyników, a potem go zapisać. Można to wykonać w mniej bezpieczny i bardziej bezpieczny sposób:
x=2.5 wynik1=x**2 wynik2=3.5*wynik1 wynik3=wynik1+wynik2 tekst=str(wynik1)+” “+str(wynik2)+”\n” tekst=tekst+str(wynik3) wyniki = open(‘wyniki.txt’, ‘w’) wyniki.write(tekst) wyniki.close() |
Ostatnia operacja zamyka plik tekstowy i zabezpiecza go przed niezamierzonymi zmianami. Chociaż w części wynikowej nic się nie pokazało, to w katalogu roboczym powstał plik tekstowy ‘wyniki.txt’.
Funkcja open() otwiera plik z kilkoma trybami zaznaczonymi po nazwie po przecinku w cudzysłowach. Są to “r” (do odczytu), “w” (do zapisu), ‘x’ (utworzenie nowego pliku do zapisu), ‘a’ (otworzenie do zapisu na końcu pliku , ‘b’ (zapis binarny), ‘t’ (zapis tekstowy), ‘+’ (aktualizacja danych). Tryby te można łączyć (np. ‘rt’, ‘wb’). W przypadku pokazanego zapisu do pliku poszczególnych linijek można porównać program z otwieraniem w trybie ‘a’ oraz ‘w’ wykonując go kilkakrotnie.
Bywa, że wyniki zapisywane w pliku tekstowym są jednocześnie używane w programie, gdy już zmienne je oznaczające uległy modyfikacjom. Oznacza to poszukanie odpowiednich wartości w zapisanym tekście i przypisanie ich zmiennym. Przeszukiwanie tekstu jest dość kłopotliwe i wymaga zapisania więcej instrukcji niż na przykład przeszukanie listy. Możliwe jest od początku tworzenie listy wyników i jednocześnie zapisywanie ich do pliku tekstowego. Wygląda to następująco:
tekst =[]
for i in range (6): wiersz = str(i) + ” ” +str(2**i) tekst.append(wiersz + “\n”) open(‘wyniki.txt’, ‘w’).writelines(tekst) |
tekst =[]
for i in range (6): wiersz = str(i) + ” ” +str(2**i) tekst.append(wiersz + “\n”) wyniki = open(‘wyniki.txt’, ‘w’) wyniki.writelines(tekst) wyniki.close() |