2.3. Operacje matematyczne

Python od razu działa jak kalkulator. Ta strona omawia operatory, których będziesz używać najczęściej: arytmetykę na liczbach, porównania zwracające wartości logiczne, operatory logiczne łączące warunki oraz operatory bitowe do pracy na poziomie sprzętu.

2.3.1. Arytmetyka

Standardowe operatory arytmetyczne na wartościach int i float:

  • + – dodawanie

  • - – odejmowanie (lub negacja jako przedrostek: -x)

  • * – mnożenie

  • / – dzielenie. Zawsze zwraca float, nawet gdy oba operandy są liczbami całkowitymi.

  • // – dzielenie całkowite. Zwraca iloraz całkowity zaokrąglony w stronę minus nieskończoności.

  • % – modulo (reszta z dzielenia).

  • ** – potęgowanie (2 ** 10 to 1024).

>>> 7 / 2
3.5
>>> 7 // 2
3
>>> -7 // 2
-4
>>> 7 % 2
1
>>> 2 ** 16
65536

Arytmetyka na mieszanych typach automatycznie promuje liczby całkowite do zmiennoprzecinkowych:

>>> 3 + 0.5
3.5

Przypisanie złożone łączy operator ze znakiem =, dając zwięzłą aktualizację w miejscu:

counter = 0
counter += 1                # equivalent to counter = counter + 1
counter *= 2                # works for *= /= //= %= **= too

Kolejność operatorów jest zgodna z konwencją: najpierw **, potem jednoargumentowy -, następnie *, /, // i %, a na końcu + i -. Gdy nie masz pewności, używaj nawiasów – w czasie wykonania nic nie kosztują.

2.3.2. Porównania

Operatory porównania zwracają wartość bool (True lub False):

  • == i != – równe / różne.

  • <, <=, >, >= – porządkowanie.

>>> 3 == 3
True
>>> 3 == 3.0
True
>>> 3 < 5 <= 5
True

Ostatni przykład to porównanie łańcuchowe i jest dokładnie równoważne 3 < 5 and 5 <= 5.

Ostrzeżenie

= przypisuje; == porównuje. Wyrażenie if x = 5: jest błędem składni właśnie dlatego, że Python odmawia ich cichego pomylenia.

2.3.3. Logika boolowska

Trzy operatory łączą wartości logiczne:

  • andTrue tylko wtedy, gdy obie strony są prawdziwe.

  • orTrue, gdy którakolwiek strona jest prawdziwa.

  • not – odwraca pojedynczą wartość logiczną.

and i or skracają wykonanie (short-circuit): przestają ewaluować, gdy tylko wynik jest znany. False and slow_check() nigdy nie wywołuje slow_check.

and i or zwracają również jeden ze swoich operandów, a nie dosłowną wartość True lub False, co pozwala zwięźle zapisywać wartości domyślne:

name = user_name or "anonymous"   # "" / 0 / None are falsy

2.3.4. Operatory bitowe

Do pracy ze sprzętem – pakowania pól rejestrów, maskowania bitów, parsowania nagłówków protokołów – sięgniesz po operatory bitowe. Działają one na binarnej reprezentacji wartości int:

  • & – bitowe AND

  • | – bitowe OR

  • ^ – bitowe XOR

  • ~ – bitowe NOT (uzupełnienie do jedności)

  • << – przesunięcie w lewo

  • >> – przesunięcie w prawo

Przy odczycie i zapisie tych wartości wygodne są literały szesnastkowe i binarne:

>>> 0b1100 & 0b1010
8                              # 0b1000
>>> 0b1100 | 0b1010
14                             # 0b1110
>>> 0xFF ^ 0x0F
240                            # 0xF0
>>> 1 << 8
256
>>> (0xABCD >> 8) & 0xFF
171                            # extract the high byte

Dla każdego istnieją formy złożone: |=, &=, ^=, <<=, >>=.

Informacja

and / or działają na wartościach logicznych (lub na prawdziwości); & / | działają na bitach. Nie myl ich ze sobą. 0b1100 and 0b1010 daje w wyniku 0b1010, ponieważ oba operandy są prawdziwe – co zwykle nie jest tym, czego chcesz przy manipulowaniu bitami.

2.3.5. Przydatne funkcje wbudowane dla liczb

Garść funkcji wbudowanych obejmuje typowe operacje numeryczne, których same operatory nie zapewniają:

  • round() – najbliższa liczba całkowita lub najbliższe ndigits miejsc po przecinku, gdy podany jest drugi argument. Zwraca int dla round(x) i float dla round(x, n). Wartości graniczne (0.5, 1.5, …) zaokrągla do najbliższej liczby parzystej, a nie zawsze w górę.

  • divmod() – zwraca (quotient, remainder) w jednym wywołaniu. Przydatne do dzielenia jednej wielkości na jednostki (sekundy na minuty i sekundy, bajty na strony i przesunięcia).

  • pow() – to samo co ** w formie dwuargumentowej. Forma trzyargumentowa pow(base, exp, mod) oblicza (base ** exp) % mod bez tworzenia gigantycznej wartości pośredniej, co jest jedynym praktycznym sposobem na potęgowanie modularne dla dużych wykładników.

>>> round(3.7)
4
>>> round(3.14159, 2)
3.14
>>> round(0.5)               # ties go to even, not always up
0
>>> round(1.5)
2

>>> divmod(125, 60)          # 125 seconds = 2 min, 5 sec
(2, 5)
>>> minutes, seconds = divmod(125, 60)

>>> pow(3, 4)                # same as 3 ** 4
81
>>> pow(3, 100, 7)           # (3 ** 100) mod 7, efficient
4

Konwersje liczby całkowitej na łańcuch w różnych systemach (bin, oct, hex) są omówione w Metody łańcuchów i formatowanie.

2.3.6. Moduł math

Typowe funkcje matematyczne znajdują się w module math. Zaimportuj go raz i wywołuj jego funkcje za pomocą nazwy z kropką:

import math

print(math.sqrt(2))              # 1.4142135
print(math.sin(math.pi / 2))     # 1.0
print(math.floor(3.7))           # 3
print(math.log(100, 10))         # 2.0

Moduł math w MicroPython obejmuje zwykłe funkcje (sqrt, exp, log, sin, cos, tan, atan2, floor, ceil, pi, e, …). Po liczby losowe zajrzyj do modułu random; do operacji bitowych na stałoprzecinkowych liczbach zwykle wystarczą powyższe operatory.

2.3.7. Liczby zespolone

Do obliczeń wymagających składników urojonych Python ma typ complex z literałami z przyrostkiem j (1 + 2j). Moduł cmath odzwierciedla math dla danych zespolonych. Oba są obecne w większości kompilacji MicroPython, ale rzadko są potrzebne przy pracy z kamerą; wspominamy o nich głównie po to, by nie zaskoczyły cię przy przenoszeniu kodu, który ich używa.