TI/Stałe i zmienne: Różnice pomiędzy wersjami
Linia 126: | Linia 126: | ||
− | + | ;Uwaga dla programujących w językach ze statycznym typowaniem (jak C/C++) | |
Aby użyć zmiennej, wystarczy przydzielić jej jakąś wartość. Nie musimy tej zmiennej deklarować ani nadawać jej konkretnego typu danych. | Aby użyć zmiennej, wystarczy przydzielić jej jakąś wartość. Nie musimy tej zmiennej deklarować ani nadawać jej konkretnego typu danych. | ||
− | |||
=== Przykład użycia zmiennych i stałych dosłownych === | === Przykład użycia zmiennych i stałych dosłownych === |
Wersja z 19:25, 22 maj 2015
Spis treści
Stałe dosłowne
Przykładem stałej dosłownej jest:
- liczba, np. 5, 1.23, 9.25e-3
- napis w rodzaju 'To jest napis' albo "To też jest napis!".
Nazywa się ją dosłowną, bo jest dosłowna, tzn. zawsze używasz jej wartości w sposób dosłowny. Przykładowo liczba 2 zawsze reprezentuje samą siebie i nic innego. Jest stałą, ponieważ jej wartości nie można zmienić. Stąd wszystkie stałe tego typu nazywa się stałymi dosłownymi.
Zadanie
Proszę skorzystać z linii poleceń pythona jak ze standardowego kalkulatora.
Wpisywane przez nas liczby to stałe dosłowne. Proszę zwrócić uwagę na wyniki dzielenia 1/2 i 1.0/2
Liczby
Liczby w Pythonie dzielimy na trzy główne typy: całkowite (ang. integers), zmiennoprzecinkowe (ang. floating point albo krócej: float) i zespolone (ang. complex).
- Przykładami liczb całkowitych są 2 i 1025.
- Przykłady liczb zmiennoprzecinkowych to: 3.23 i 52.3E–4.
W przypadku liczb zmiennoprzecinkowych część znajdująca się przed znakiem E nazywana jest mantysą. Po znaku E znajduje się wykładnik. Wartość liczby to mantysa razy 10 podniesione do danego wykładnika.
52.3E–4 = 52,3·10–4
- Jednostkę urojoną zapisujemy jako j po liczbie, tak więc
–5 + 4j = –5 + 4i 2.3 – 4.6j = 2,3 – 4,6i 1j = i
Napisy
Napis (ang. string) to po prostu ciąg znaków.
Apostrof (')
Napis można zapisać w programie używając apostrofów
'Możecie mnie cytować.'
Wszystkie znaki (litery, odstępy, tabulatory) są zachowane w niezmienionej postaci.
Cudzysłów (")
Napisy w cudzysłowach zapisuje się tak samo jak w apostrofach.
"Zażółcić gęślą jaźń."
Różnica jest taka, że w napisie w apostrofach można łatwo zawrzeć cudzysłów, a w napisie w cudzysłowach, apostrof. Później, w trakcie używania napisu, nie ma żadnego znaczenia to, w jaki sposób został on zapisany.
Potrójny cudzysłów lub apostrof (""" lub ''')
Za pomocą potrójnych cudzysłowów lub apostrofów możesz oznaczać napisy wielolinijkowe. Co więcej, wewnątrz nich możesz swobodnie używać zarówno cudzysłowów jak i apostrofów. Najlepiej zilustruje to przykład:
'''Litwo, ojczyzno moja,
ty jesteś jak zdrowie.
Ile cię trzeba cenić,
ten tylko się dowie,
kto cię stracił.
'''
Sekwencje specjalne
Wyobraź sobie, że chcesz zapisać napis, który zawiera apostrof ('), na przykład Nie lubię Harry'ego. Nie można zapisać 'Nie lubię Harry'ego', bo Python nie zrozumie, gdzie napis ma koniec. Musimy więc wyraźnie zaznaczyć, że ten konkretny apostrof pomiędzy y a e nie oznacza końca napisu. Tutaj z pomocą przychodzą nam właśnie sekwencje specjalne. Za ich pomocą możemy zapisać ów apostrof jako \', z ukośnikiem wstecznym. Zatem nasz napis, poprawnie zapisany, wygląda tak: 'Nie lubię Harry\'ego'.
W tym konkretnym wypadku lepiej jednak jest użyć cudzysłowów do zaznaczenia granic napisu: "Nie lubię Harry'ego". Po to właśnie istnieje możliwość używania zarówno cudzysłowów jak i apostrofów.
A co w przypadku napisów wielolinijkowych? Można użyć potrójnych cudzysłowów, jak pokazaliśmy wyżej. Można także użyć znaków ucieczki, aby zapisać znak specjalny — znak nowej linii. Robimy to w następujący sposób: To jest pierwszy wiersz\nTo jest drugi wiersz.
Oprócz \n istnieje więcej znaków specjalnych, ale w miarę często używa się tylko jeszcze jednego, czyli znaku tabulacji \t. Znak tabulacji zachowuje się trochę jak 8 lub 4 spacje.
Możemy także zrobić rzecz odwrotną, a mianowicie zapisać napis niezawierający znaków nowej linii w wielu wierszach w programie:
"To jest pierwsze zdanie. \
A to drugie."
Powyższy przykład jest równoważny napisowi "To jest pierwsze zdanie. A to drugie.". Zauważ, że umieściliśmy spację przed ukośnikiem wstecznym — w przeciwnym wypadku A występowałoby w napisie bezpośrednio po kropce.
- Napisy surowe
Jeżeli musisz stworzyć napis, który nie zawiera żadnych sekwencji specjalnych, a zawiera fragmenty ze wstecznymi ukośnikami, przydatną opcją są napisy surowe (ang. raw). Tworzymy je, poprzedzając napis literą r lub R. Przykład: r"Nowe linie zapisujemy za pomocą \n.".
- Napisy Unikodowe
Unikod (ang. Unicode) jest zestandaryzowanym sposobem zapisu tekstu w różnych językach. Jeśli chcesz zapisać tekst np. w języku polskim, prawdopodobnie wiesz, że najlepiej jest użyć edytora z obsługą unikodu. Python również daje Ci możliwość użycia Unikodu: wystarczy przy zapisie napisu jako przedrostek dodać u lub U, na przykład: u"Ten tekst zapisaliśmy w Unikodzie.". Niezależnie od tego, z jakiego kodowania korzysta dany komputer, nie będzie on miał problemu z poprawnym odczytaniem tekstu zapisanego w unikodzie, więc używaj unikodowego zapisu napisów dla tekstów, które zawierają np. polskie znaki, a mogą być odczytywane przez różne komputery.
W systemie linuks możemy zadeklarować chęć korzystania ze znaków w kodowaniu UTF. Do tego służy nam linijka # -*- coding: utf-8 -*- na początku kodu, która informuje interpreter, że w kodzie mogą się pojawić znaki niestandardowe (teksty zostaną zakodowane w systemie UTF-8). W systemie Windows musimy dopisywać literkę u przed ciągiem znaków zawierających polskie litery. W Linuksie owe u nie przeszkadza, więc chcąc mieć przenośny kod powinniśmy to u dopisywać.
- Napisy są niezmienne (ang. immutable)
Oznacza to, że jeżeli już raz utworzyłeś napis, nie możesz go zmienić.
- Automatyczne łączenie napisów zapisanych obok siebie
Jeżeli umieścimy dwa napisy obok siebie, Python automatycznie je połączy. Spójrz na przykład: 'Jak ' 'Cię zwą?' zostanie automatycznie przekonwertowane do 'Jak Cię zwą?'. {{Wyjaśnienie|title=Uwaga dla programujących w innych językach====
- Uwaga dla programujących w C/C++
- W Pythonie nie ma wydzielonego typu char. Nie ma takiej potrzeby, bo napis o długości 1 służy jako znak.
- Uwaga dla programujących w Perlu/PHP
- Pamiętajcie, że napisy zawarte w pojedynczych i podwójnych cudzysłowach są dokładnie tym samym: nie ma żadnej różnicy za wyjątkiem zapisu.
Zmienne
Używanie tylko stałych dosłownych może szybko stać się nudne — potrzebujemy sposobu przechowywania informacji i manipulowania nimi. Do tego właśnie służą zmienne. Są dokładnie tym, co mówi nam ich nazwa, czyli mogą ulegać zmianom, a to oznacza, że możesz w nich przechowywać cokolwiek. Zmienne to nic innego, tylko fragmenty pamięci Twojego komputera, w których przechowywana jest jakaś informacja. W przeciwieństwie do stałych, musisz mieć możliwość dostępu do tych danych, tak więc zmiennym nadajemy nazwy. Najpierw tylko zobaczmy, jakie nazwy możesz nadać zmiennym.
Nazewnictwo identyfikatorów
Zmienne są przykładami identyfikatorów. Identyfikatory to nazwy, które nadajemy czemuś do zidentyfikowania tego. Tworząc identyfikatory w Pythonie, musisz trzymać się kilku zasad:
- Pierwszym znakiem identyfikatora musi być mała lub wielka litera alfabetu łacińskiego (więc polskie znaki są niedopuszczalne) albo podkreślnik (_).
- Pozostałe znaki mogą zawierać małe lub wielkie litery alfabetu łacińskiego, podkreślniki oraz cyfry (0-9).
- Wielkość znaków w identyfikatorze jest ważna. Stąd mojanazwa i mojaNazwa to zupełnie co innego. Zwróć uwagę na wielkie N w drugim przykładzie.
- Przykłady poprawnych identyfikatorów to: i, __moja_nazwa, nazwa_23, a1b2_c3.
- Przykłady niepoprawnych identyfikatorów to: 2nazwy, nazwa ze spacjami, moja-nazwa.
Aby nadać zmiennej jakąś wartość trzeba wartość przypisać do zmiennej. Robi się to przy pomocy operatora = (operatora przypisania). Zwróć uwagę, że jest to zupełnie inny sens znaku „=” niż w matematyce.
Zadanie
Proszę w linii komend wytworzyć na próbę prawidłowe i nieprawidłowe nazwy zmiennych.
- Uwaga dla programujących w językach ze statycznym typowaniem (jak C/C++)
Aby użyć zmiennej, wystarczy przydzielić jej jakąś wartość. Nie musimy tej zmiennej deklarować ani nadawać jej konkretnego typu danych.
Przykład użycia zmiennych i stałych dosłownych
Teraz zobaczymy, jak w programach używać zmiennych razem ze stałymi dosłownymi.
Polecenie
Zapisz poniższy przykład i uruchom program.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Nazwa pliku: zmienne.py
i = 5
print i
i = i + 1
print i
s = '''To jest napis wielolinijkowy.
To jest drugi wiersz.'''
print s
- Spodziewany wynik:
$ python zmienne.py
5
6
To jest napis wielolinijkowy.
To jest drugi wiersz.
Jak to działa?
Najpierw przypisujemy stałą dosłowną 5 do zmiennej i za pomocą operatora przypisania (=). Linia ta nazywa się poleceniem, ponieważ zleca ona Pythonowi wykonanie czegoś: w tym przypadku łączymy nazwę zmiennej i z wartością 5.
Następnie, również za pomocą polecenia, wypisujemy wartość zmiennej i na ekran, używając print.
Później dodajemy 1 do wartości przechowywanej w zmiennej i i zapisujemy nowo obliczoną wartość z powrotem do zmiennej i. Potem wypisujemy wartość zmiennej i i, jak się spodziewaliśmy, dostajemy 6.
Analogicznie postępujemy ze zmienną s, której przydzielamy wartość dosłowną napisu i wypisujemy ją.
Zadanie
Napisać program witaj ze zmienną (tzn. niech imię będzie zmienną, a program będzie wypisywał Witaj, imię).
W czasie wykonywania programu możemy podawać mu dane. Jedną z funkcji służących do wprowadzania danych przez użytkownika w czasie wykonywania programu jest raw_input(). Z funkcji tej można skorzystać np. tak: a = raw_input(napis, który program ma wyświetlić). Takie wywołanie funkcji powoduje wyświetlenie w konsoli podanego w argumencie napisu. Następnie funkcja czeka, aż użytkownik napisze coś i zakończy wprowadzanie danych naciśnięciem Enter. Wprowadzony przez użytkownika napis przypisywany jest do zmiennej a.
Zadanie
Napisać program witaj, który najpierw zapyta użytkownika o imię a następnie wypisze Witaj, imię).
Typy danych
Zmienne przechowują wartości różnego rodzaju: są to typy danych. Podstawowe typy danych już poznaliśmy, są to liczby i napisy. W następnych rozdziałach dowiemy się, jak tworzyć nasze własne typy danych za pomocą klas.
Obiekty
Od teraz zapamiętaj, że Python traktuje wszystkie rzeczy użyte w programie jako obiekty. Rozumiemy to w ogólnym sensie. Zamiast mówić "to coś", mówimy "ten obiekt". {{Wyjaśnienie|title=Uwaga dla programujących w językach zorientowanych obiektowo| text= Python jest silnie zorientowany obiektowo, co oznacza, że wszystko jest obiektem, włącznie z liczbami, napisami i funkcjami.
Operatory
Większość poleceń, jak będziesz w przyszłości pisał, będzie zawierała wyrażenia (ang. expressions). Prostym przykładem wyrażenia może być 2 + 3. Wyrażenie możemy podzielić na operatory i operandy.
Operatory to funkcjonalności, które coś robią i są reprezentowane przez symbole, jak +, albo przez specjalne słowa kluczowe. Operatory, jak sama nazwa wskazuje, muszą na czymś operować — tym czymś są operandy. W naszym przypadku operandami są 2 i 3. Spójrz na tabelę przedstawiającą operatory i ich użycie.
Zanim jednak to zrobisz, pozwól, że przypomnę Ci, że możesz obliczyć wartość wyrażenia, bezpośrednio używając linii poleceń interpretera. Spójrz na przykład:
>>> 2 + 3
5
>>> 3 * 5
15
>>>
Polecenie
Proszę przetestować działnie wybranych operatorów z poniższej tabeli
Tabela operatorów
Uwaga: nie musisz od razu przyswajać sobie całej poniższej tabeli. Jest ona duża, ale po to, żeby wszystkie informacje na ten temat były zebrane w jednym miejscu. Można będzie do niej wracać w razie potrzeby, w trakcie późniejszej nauki.
Operator | Nazwa | Wyjaśnienie | Przykłady | |
---|---|---|---|---|
o p e r a c j e a l g e b r a i c z n e |
+ | Plus | Dodaje dwa obiekty. | 3 + 5 daje 8.'a' + 'b' daje 'ab'. |
– | Minus | Daje liczbę przeciwną do danej liczby bądź odejmuje jedną liczbę od drugiej. | –5.2 daje liczbę ujemną.
50 – 24 daje 26. | |
* | Mnożenie | Daje iloczyn dwóch liczb bądź zwraca napis powtórzony zadaną liczbę razy. | 2 * 3 daje 6.
'la' * 3 daje 'lalala'. | |
** | Potęgowanie | Zwraca x do potęgi y. | 3 ** 4 daje 81 (czyli 3 * 3 * 3 * 3). | |
/ | Dzielenie | Dzieli x przez y. | 4 / 3 daje 1 (ponieważ dzielimy dwie liczby całkowite).
4.0 / 3 oraz 4 / 3.0 daje 1.3333333333333333. | |
// | Dzielenie całkowite (ang. floor division) | Zwraca wynik dzielenia całkowitego. | 4 // 3.0 daje 1. | |
% | Dzielenie modulo | Zwraca wynik z dzielenia modulo, czyli po prostu resztę z dzielenia. | 8 % 3 daje 2.
-25.5 % 2.25 daje 1.5. | |
o p e r a c j e b i t o w e |
<< | Przesunięcie bitowe (ang. shift) w lewo | Przesuwa daną liczbę o zadaną liczbę bitów w lewo (pamiętaj, że liczby są zapisywane w pamięci postaci dwójkowej, czyli przez 0 i 1). | 2 << 2 daje 8. 2 to 10 w zapisie dwójkowym. Przesunięcie w lewo o 2 bity daje 1000, czyli 8 w zapisie dziesiętnym. |
>> | Przesunięcie bitowe w prawo | Przesuwa daną liczbę o zadaną liczbę bitów w prawo. | 11 >> 1 daje 5. 11 w zapisie dwójkowym to 1011, czyli przesuwając o 1 bit w prawo dostajemy 101, czyli 5 w zapisie dziesiętnym. | |
& | Iloczyn bitowy (bitowe „i”, ang. bitwise AND) | Zwraca iloczyn bitowy wszystkich odpowiadających bitów podanych liczb. | 5 & 3 daje 1. | |
| | Suma (alternatywa) bitowa (bitowe „lub”, ang. bitwise OR) | Zwraca sumę bitową wszystkich odpowiadających bitów podanych liczb. | 5 | 3 daje 7. | |
^ | Bitowa różnica symetryczna (bitowe „albo”, ang. bitwise XOR) | Zwraca bitową różnicę symetryczną wszystkich odpowiadających bitów podanych liczb. | 5 ^ 3 daje 6. | |
~ | Odwrócenie wszystkich bitów (ang. bitwise invert) | Odwrócenie wszystkich bitów x daje –(x+1). | ~5 daje –6. | |
p r z y r ó w n a n i a |
< | Mniejsze niż | Zwraca wartość logiczną zdania „x mniejsze od y”. Wszystkie operatory porównania zwracają True (prawda) lub False (fałsz). Zwróć uwagę na wielkie litery na początku. | 5 < 3 daje False, a 3 < 5 daje True.
Porównania mogą być dowolnie łączone: 3 < 5 < 7 daje True. |
> | Większe niż | Zwraca wartość logiczną zdania „x większe od y”. | 5 > 3 daje True. | |
<= | Mniejsze lub równe | Zwraca wartość logiczną zdania „x mniejsze lub równe y”. | x = 3; y = 6
x <= y daje True. | |
>= | Większe lub równe | Zwraca wartość logiczną zdania „x większe lub równe y”. | x = 4; y = 3
x >= 3 daje True. | |
== | Równe | Zwraca wartość logiczną zdania „x równe y”. | x = 2; y = 2; x == y daje True.
x = 'str'; y = 'stR'; x == y daje False. x = 'str'; y = 'str'; x == y daje True. | |
!= | Nie jest równe | Zwraca wartość logiczną zdania „x nie jest równe y”. | x = 2; y = 3
x != y daje True. | |
o p e r c j e l o g i c z n e |
not | Zaprzeczenie logiczne (logiczne „nie”, ang. boolean NOT) | Jeśli x jest prawdą, zwracane jest False. Jeśli x jest fałszem, zwracane jest True. | x = True; not x daje False. |
and | Iloczyn logiczny (logiczne „i”, ang. boolean AND) | x and y zwraca x, jeżeli x jest fałszem, w przeciwnym wypadku zwraca y | x = False; y = sin(30)
x and y daje False, ponieważ x jest fałszem. W tym przypadku Python nie oblicza wartości y, ponieważ w trakcie wykonywania iloczynu okazuje się, że lewa strona wyrażenia jest nieprawdą, co oznacza, że na pewno całe wyrażenie jest nieprawdą, niezależnie od wartości logicznej y. Nazywa się to warunkowym obliczaniem wartości wyrażenia {{ang|short-circuit evaluation. | |
or | Suma logiczna (logiczne „lub”, ang. boolean OR) | Jeśli x jest prawdą, zwracane jest x, w przeciwnym wypadku zwracane jest y. | x = 3; y = False
x or y zwraca 3. Warunkowe wyliczanie wartości również tutaj ma zastosowanie. | |
o p e r c j e n a z b i o r a c h |
| | Suma zbiorów | Zwraca zbiór wszystkich elementów które są w pierwszym zbiorze lub są w drugim zbiorze. | set([1,3,5]) | set([7,3]) daje set([1,3,5,7]). |
− | Różnica zbiorów | Zwraca zbiór elementów które są w pierwszym zbiorze i nie są w drugim zbiorze. | set([1,3,5]) − set([7,3]) daje set([1,5]). | |
& | Przecięcie (część wspólna, iloczyn) zbiorów | Zwraca zbiór elementów które są w pierwszym zbiorze i są w drugim zbiorze. | set([1,3,5]) & set([7,3]) daje set([3]). | |
^ | Elementy unikalne | Zwraca zbiór zawierający elementy nie będące wspólne dla dwu zbiorów. | set([1,3,5]) ^ set([7,3]) daje set([1,5,7]). | |
in | Sprawdzenie czy jest elementem. | Zwraca wartość logiczną zdania „x jest elementem zbioru A”. | 3 in set([1,3,5]) daje True. | |
not in | Sprawdzenie czy nie jest elementem | Zwraca wartość logiczną zdania „x nie jest elementem zbioru A”. | 3 not in set([1,3,5]) daje False. | |
< | Sprawdzenie czy jest podzbiorem | Zwraca wartość logiczną zdania „A jest podzbiorem zbioru B”. | set([1,3]) < set([7,3]) daje False. set([1,3]) < set([1,7,3]) daje True. | |
> | Sprawdzenie czy jest nadzbiorem | Zwraca wartość logiczną zdania „A jest nadzbiorem zbioru B”. | set([1,5,3]) > set([7,3]) daje False. set([1,5,3]) > set([1,3]) daje True. | |
== | Sprawdzenie czy są jednakowe | Zwraca wartość logiczną twierdzenia, że każdy element pierwszego zbioru jest elementem drugiego zbioru i każdy element drugiego zbioru jest elementem pierwszego. | set([1,3,5]) == set([7,3]) daje False. set([1,3,5]) == set([5,3,1]) daje True. | |
!= | Sprawdzenie czy nie są jednakowe | Zwraca wartość logiczną twierdzenia, że pierwszy zbiór nie jest jednakowy z drugim. | set([1,3,5]) != set([7,3]) daje True. |
Nie ma obowiązku przyswojenia całej tabeli operatorów naraz — jej zawartość jest po kolei omawiana w następnych rozdziałach: operacje algebraiczne za moment, operacje logiczne i przyrównania w rozdziale o wykonaniu warunkowym, a operacje bitowe w rozdziale o operacjach bitowych.
Kolejność wykonywania
Jeśli mamy wyrażenie typu 2 + 3 * 4, co jest wykonywane najpierw: dodawanie czy mnożenie? Znając reguły matematyczne, możemy stwierdzić, ze mnożenie powinno być wykonane w pierwszej kolejności, co oznacza, że operator mnożenia ma wyższy priorytet {{ang|precedence od operatora dodawania. O kolejności wykonywania operacji decyduje tabela priorytetów operatorów.
Jeśli chcesz zmienić kolejność wykonywania działań, również musisz użyć nawiasów. Aby dodawanie zostało wykonane przed mnożeniem, należy napisać na przykład (2 + 3) * 4.
Czasem używa się nawiasów, mimo że nie powoduje to zmiany kolejności wykonywania. Przykładowo można napisać 2 + (3 * 4), żeby podkreślić, że mnożenie jest wykonywane wcześniej. Nie należy z tym przesadzać.
Poniższa tabela daje nam spojrzenie na priorytety operatorów w Pythonie, od najwyższego (wykonywanego najpierw) do najniższego (wykonywany w ostatniej kolejności). W praktyce wygląda to tak, że w wyrażeniu najpierw wykonane zostaną operacje położone wyżej w tabeli, a dopiero potem te z niższych wierszy.
Poniższa tabela jest dość obszerna (pochodzi z dokumentacji Pythona), aby dać pełne spojrzenie na to zagadnienie. Priorytety operatorów są dobrane tak, by były zgodne z przyzwyczajeniami wziętymi z matematyki, a także by można były popularne wyrażenia zapisać bez nawiasów. O tym, czy należy użyć nawiasów w sytuacji gdy nie są konieczne, decyduje czytelność. Jeśli program jest bardziej zrozumiały z nawiasami, to należy ich użyć.
Operator | Opis |
---|---|
(), [], {}, ` ` | wszystkie formy naturalnie zagnieżdzone: konstrukcja krotki, listy i słownika, przekształcenie w napis |
f(argumenty ...), x[indeks:indeks], x[indeks], x.atrybut | wywołanie funkcji, pobranie wycinka, wydobycie elementu, dostęp do atrybutu. |
** | potęgowanie |
~x, +x, –x | inwersja bitowa, liczba, liczba przeciwna (operatory jednoargumentowe). |
*, /, //, % | mnożenie, dzielenie, dzielenie całkowite i dzielenie modulo |
+, – | dodawanie i odejmowanie (operatory dwuargumentowe) |
<<, >> | przesunięcia bitowe |
& | iloczyn bitowy |
^ | bitowa różnica symetryczna |
| | suma bitowa |
is, is not, in, not in, <, <=, >, >=, !=, == | sprawdzanie identyczności, sprawdzanie przynależności, porównania. |
not x | zaprzeczenie logiczne |
and | iloczyn logiczny |
or | suma logiczna |
lambda | wyrażenie lambda |
Operatory, z którymi się jeszcze nie zapoznaliśmy, zostaną wyjaśnione w następnych rozdziałach.
Operatory mające taki sam priorytet znajdują się w jednym wierszu powyższej tabeli. Przykładowo, + i – mają taki sam priorytet.
przykład
Weźmy wyrażenie -x**1/2. Jak zostanie ono zinterpretowane?
W tym wyrażeniu występują trzy operatory, -, ** i /, oraz trzy operandy, x, 1 i 2. Jeśli zajrzymy do tabelki powyżej, to zobaczymy, że idąc od góry, najpierw pojawia się potęgowanie, potem negacja, a jeszcze później dzielenie.
Wobec tego właściwa kolejność wykonywania jest taka: (-(x**1))/2.
przykład dla bardziej zaawansowanych
Załóżmy, że chcemy sprawdzić, czy rozwiązania równania kwadratowego, [math]x_1[/math], [math]x_2[/math], są poprawne i ułożone rosnąco.
delta < 0 or a*x1**2 + b*x1 + c == 0 and a*x2**2 + b*x2 + c == 0 and x1 <= x2
Wyrażenie nie jest zbyt przejrzyste, więc w prawdziwym programie lepiej byłoby tak nie pisać. Niemniej jest poprawne, co widać w poniższym równoważnym zapisie.
(
( delta < 0 )
or
(
((a*x1**2 + b*x1 + c) == 0 )
and
((a*x2**2 + b*x2 + c) == 0 )
and
(x1 <= x2)
)
)
Szczegółowo:
- or ma najniższy priorytet
- and jest zaraz potem
- przyrównanie == ma niższy priorytet niż operacje algebraiczne *,**, +
- kolejność wykonywania operacji algebraicznych jest taka sama jak w zwykłej matematyce, czyli najpierw potęgowanie, potem mnożenie, a na końcu dodawanie.
Łączność operatorów
Operatory są zazwyczaj łączone od lewej do prawej, co oznacza, że operacje z tym samym pierwszeństwem są wykonywane od lewej do prawej. Przykładowo 2 - 3 - 4 jest wykonywane jak (2 - 3) - 4, czyli daje wynik −5.
Wyjątkiem w stosunku do łączności lewostronnej jest operator potęgowania, który jest łączony od prawej do lewej, np. 3**3**3 daje [math]3^{\left(3^3\right)}[/math], a nie [math]\left(3^3\right)^3[/math]. Czyli potęgowanie w Pythonie zachowuje się tak jak normalnie w matematyce.
Przyrównania (==, <=, <=, >=, <, >, !=) w zasadzie są łączne lewostronnie, ale w praktyce w przypadku zwykłych obiektów wynik nie zależy od kolejności wykonania. Jeśli wielokrotne przyrównania są połączone w ciąg, to wartością takiego wyrażenia jest iloczyn logiczny wszystkich przyrównań.
x1 < 0 < x2
# lub równoważnie
x1 < 0 and 0 < x2
Przypisanie do wielu zmiennych jest traktowane jak przypisanie do wszystkich tych zmiennych tej samej wartości. Np. a = b = c to to samo co a = c i b = c.
Polecenie
Proszę przećwiczyć różne kombinacje operatorów i nawiasów.
Wyrażenia
Wyrażenia są kombinacjami zmiennych, stałych i łączących je operatorów. Przykładem może być wzór na obliczanie pola lub obwodu jakiejś figury geometrycznej.
Algorytm
- Zmierz długość prostokąta i zapamiętaj jako dlugosc.
- Zmierz szerokość prostokąta i zapamiętaj jako szerokosc.
- Oblicz pole prostokąta jako długość·szerokość (użyj zapamiętanych wartości) i zapamiętaj jako pole.
- Wypisz napis 'Pole wynosi' oraz wartość zapamiętaną jako pole.
- Wypisz napis 'Obwód wynosi' oraz wynik obliczenia 2·(długość+szerokość) używając zapamiętanych wartości, wyniku nie zapamiętuj.
====Implementacja==== Proszę przepisać i uruchomić poniższy przykład
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Nazwa pliku: wyrazenia.py
dlugosc = 5
szerokosc = 2
pole = dlugosc * szerokosc
print 'Pole wynosi', pole
print 'Obwód wynosi', 2 * (dlugosc + szerokosc)
- Spodziewany wynik
$ python wyrazenia.py Pole wynosi 10 Obwód wynosi 14
Jak to działa?
Długość i szerokość prostokąta są przechowywane w zmiennych o tych samych nazwach. Użyjemy tych zmiennych, aby za pomocą wyrażeń obliczyć pole i obwód tego prostokąta. Przechowujemy wynik wyrażenia dlugosc * szerokosc w zmiennej pole, aby wypisać jej wartość za pomocą polecenia print. W przypadku obwodu bezpośrednio używamy wyrażenia 2 * (dlugosc + szerokosc) w poleceniu print.
Zwróć uwagę na to, że Python jest napisany tak, by ułatwić życie programiście. Mimo, że nie umieściliśmy spacji pomiędzy 'Pole wynosi', a zmienną pole, Python wstawił ją tam za nas. Oddzielenie wypisywanych wartości spacjami to najpowszechniejsza potrzeba programisty, więc tak się dzieje, jeśli poda on pare rzeczy do wypisania.
Zadanie
Proszę napisać program do obliczania pola i obwodu koła.