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 zwracafloat, 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 ** 10to 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:
and–Truetylko wtedy, gdy obie strony są prawdziwe.or–True, 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ższendigitsmiejsc po przecinku, gdy podany jest drugi argument. Zwracaintdlaround(x)ifloatdlaround(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 trzyargumentowapow(base, exp, mod)oblicza(base ** exp) % modbez 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.