2.3. Matematické operace

Python funguje jako kalkulačka rovnou po vybalení. Tato stránka pokrývá operátory, které budete používat nejčastěji: aritmetiku s čísly, porovnání produkující boolean hodnoty, logické operátory kombinující podmínky a bitové operátory pro práci na úrovni hardwaru.

2.3.1. Aritmetika

Standardní aritmetické operátory pro hodnoty typu int a float:

  • + – sčítání

  • - – odčítání (nebo negace v prefixové podobě: -x)

  • * – násobení

  • / – dělení. Vždy vrací float, i když jsou oba operandy celá čísla.

  • // – celočíselné dělení. Vrací celočíselný podíl zaokrouhlený směrem k minus nekonečnu.

  • % – modulo (zbytek po dělení).

  • ** – umocňování (2 ** 10 je 1024).

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

Aritmetika smíšených typů automaticky povyšuje celá čísla na float:

>>> 3 + 0.5
3.5

Rozšířené přiřazení kombinuje operátor s = pro kompaktní aktualizaci na místě:

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

Priorita operátorů se řídí obvyklým pořadím: nejdříve **, poté unární -, dále *, /, // a %, nakonec + a -. Pokud si nejste jisti, použijte závorky – za běhu nic nestojí.

2.3.2. Porovnání

Porovnávací operátory vracejí bool (True nebo False):

  • == a != – rovno / nerovno.

  • <, <=, >, >= – uspořádání.

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

Poslední příklad je řetězené porovnání a je přesně ekvivalentní výrazu 3 < 5 and 5 <= 5.

Varování

= přiřazuje; == porovnává. Výraz if x = 5: je syntaktická chyba právě proto, že Python odmítá tyto dvě věci tiše zaměňovat.

2.3.3. Booleovská logika

Boolean hodnoty kombinují tři operátory:

  • andTrue pouze tehdy, jsou-li obě strany pravdivé.

  • orTrue, je-li pravdivá kterákoli ze stran.

  • not – invertuje jednu boolean hodnotu.

and a or vyhodnocují zkráceně: přestanou vyhodnocovat, jakmile je výsledek znám. False and slow_check() nikdy nezavolá slow_check.

and a or také vracejí jeden ze svých operandů místo doslovného True nebo False, což umožňuje kompaktně zapisovat výchozí hodnoty:

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

2.3.4. Bitové operátory

Pro práci s hardwarem – skládání polí registrů, maskování bitů, parsování hlaviček protokolů – sáhnete po bitových operátorech. Pracují s binární reprezentací hodnoty int:

  • & – bitové AND

  • | – bitové OR

  • ^ – bitové XOR

  • ~ – bitové NOT (jedničkový doplněk)

  • << – posun vlevo

  • >> – posun vpravo

Hexadecimální a binární zápis literálů je při čtení a zápisu těchto hodnot pohodlný:

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

Pro každý z nich existuje rozšířená podoba: |=, &=, ^=, <<=, >>=.

Poznámka

and / or pracují s boolean hodnotami (nebo s pravdivostí); & / | pracují s bity. Nezaměňujte je. 0b1100 and 0b1010 se vyhodnotí jako 0b1010, protože oba operandy jsou pravdivé – což obvykle není to, co chcete při manipulaci s bity.

2.3.5. Užitečné vestavěné funkce pro čísla

Hrstka vestavěných funkcí pokrývá běžné číselné operace, které samotné operátory neumějí:

  • round() – nejbližší celé číslo, nebo nejbližší hodnota na ndigits desetinných míst, je-li zadán druhý argument. Pro round(x) vrací int, pro round(x, n) vrací float. Půlení (0.5, 1.5, …) se zaokrouhluje k nejbližšímu sudému číslu, nikoli vždy nahoru.

  • divmod() – vrací jedním voláním (quotient, remainder). Hodí se k rozdělení jedné veličiny na jednotky (sekundy na minuty a sekundy, bajty na stránky a offsety).

  • pow() – ve dvouargumentové podobě totéž jako **. Tříargumentová podoba pow(base, exp, mod) počítá (base ** exp) % mod, aniž by kdy vytvořila obrovskou mezihodnotu, což je jediný praktický způsob, jak provádět modulární umocňování pro velké exponenty.

>>> 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

Převody celých čísel na řetězce v různých soustavách (bin, oct, hex) jsou popsány v Metody a formátování řetězců.

2.3.6. Modul math

Běžné matematické funkce sídlí v modulu math. Importujte jej jednou a volejte jeho funkce přes tečkový zápis:

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

MicroPython modul math pokrývá obvyklé funkce (sqrt, exp, log, sin, cos, tan, atan2, floor, ceil, pi, e, …). Pro náhodná čísla viz modul random; pro práci s pevnou řádovou čárkou na úrovni bitů obvykle postačí výše uvedené operátory.

2.3.7. Komplexní čísla

Pro numerickou práci, která potřebuje imaginární složky, má Python typ complex s literály se sufixem j (1 + 2j). Modul cmath zrcadlí math pro komplexní vstupy. Oba jsou přítomny ve většině sestavení MicroPythonu, ale pro práci s kamerou jsou potřeba jen zřídka; zmiňujeme je hlavně proto, aby vás nepřekvapily, pokud budete přenášet kód, který je používá.