2.3. Matematičke operacije

Python radi kao kalkulator odmah po pokretanju. Ova stranica obrađuje operatore koje ćete najčešće koristiti: aritmetiku nad brojevima, usporedbe koje daju boolean vrijednosti, logičke operatore koji kombiniraju uvjete i bitovne operatore za rad na razini sklopovlja.

2.3.1. Aritmetika

Standardni aritmetički operatori nad vrijednostima tipa int i float:

  • + – zbrajanje

  • - – oduzimanje (ili negacija, kao prefiks: -x)

  • * – množenje

  • / – dijeljenje. Uvijek vraća float, čak i kad su oba operanda cijeli brojevi.

  • // – cjelobrojno dijeljenje. Vraća cjelobrojni kvocijent zaokružen prema minus beskonačnosti.

  • % – modulo (ostatak).

  • ** – potenciranje (2 ** 10 je 1024).

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

Aritmetika mješovitih tipova automatski promiče cijele brojeve u float vrijednosti:

>>> 3 + 0.5
3.5

Proširena dodjela kombinira operator sa = za sažeto ažuriranje na mjestu:

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

Prioritet operatora slijedi uobičajeni redoslijed: prvo **, zatim unarni -, pa *, /, // i %, zatim + i -. Koristite zagrade kad niste sigurni – one ne koštaju ništa u izvođenju.

2.3.2. Usporedba

Operatori usporedbe vraćaju bool (True ili False):

  • == i != – jednako / nejednako.

  • <, <=, >, >= – uređenje.

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

Posljednji primjer je ulančana usporedba i potpuno je ekvivalentan izrazu 3 < 5 and 5 <= 5.

Upozorenje

= dodjeljuje; == uspoređuje. Izraz if x = 5: je sintaksna pogreška upravo zato što Python odbija tiho zamijeniti to dvoje.

2.3.3. Booleova logika

Tri operatora kombiniraju boolean vrijednosti:

  • andTrue samo kad su obje strane istinite.

  • orTrue kad je bilo koja strana istinita.

  • not – invertira jednu boolean vrijednost.

and i or se kratko spajaju: prestaju s vrednovanjem čim je rezultat poznat. False and slow_check() nikad ne poziva slow_check.

and i or također vraćaju jedan od svojih operanada, a ne doslovni True ili False, što vam omogućuje sažeto pisanje zadanih vrijednosti:

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

2.3.4. Bitovni operatori

Za rad sa sklopovljem – pakiranje polja registara, maskiranje bitova, parsiranje zaglavlja protokola – posegnut ćete za bitovnim operatorima. Oni djeluju na binarni prikaz vrijednosti tipa int:

  • & – bitovni AND

  • | – bitovni OR

  • ^ – bitovni XOR

  • ~ – bitovni NOT (jedinični komplement)

  • << – lijevi posmak

  • >> – desni posmak

Heksadekadski i binarni oblici literala prikladni su pri čitanju i pisanju ovih vrijednosti:

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

Za svaki postoje i prošireni oblici: |=, &=, ^=, <<=, >>=.

Napomena

and / or djeluju na boolean vrijednosti (ili na istinitost); & / | djeluju na bitove. Nemojte ih miješati. 0b1100 and 0b1010 daje rezultat 0b1010 jer su oba operanda istinita – a to obično nije ono što želite pri manipulaciji bitovima.

2.3.5. Korisne ugrađene funkcije za brojeve

Nekolicina ugrađenih funkcija pokriva uobičajene numeričke operacije koje sami operatori ne nude:

  • round() – najbliži cijeli broj ili najbližih ndigits decimalnih mjesta kada se zada drugi argument. Vraća int za round(x), a float za round(x, n). Izjednačene vrijednosti (0.5, 1.5, …) zaokružuju se na najbliži parni broj, ne uvijek prema gore.

  • divmod() – vraća (quotient, remainder) u jednom pozivu. Korisno za dijeljenje jedne veličine na jedinice (sekunde u minute i sekunde, bajtove u stranice i pomake).

  • pow() – isto što i ** u obliku s dva argumenta. Oblik s tri argumenta pow(base, exp, mod) računa (base ** exp) % mod bez ikakvog materijaliziranja ogromne međuvrijednosti, što je jedini praktičan način za modularno potenciranje s velikim eksponentima.

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

Pretvorbe cijelog broja u niz znakova po bazi (bin, oct, hex) obrađene su u Metode i oblikovanje nizova znakova.

2.3.6. Modul math

Uobičajene matematičke funkcije nalaze se u modulu math. Uvezite ga jednom i pozivajte njegove funkcije putem imena s točkom:

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 pokriva uobičajene funkcije (sqrt, exp, log, sin, cos, tan, atan2, floor, ceil, pi, e, …). Za slučajne brojeve pogledajte modul random; za bitovno baratanje s fiksnim zarezom gornji operatori su obično dovoljni.

2.3.7. Kompleksni brojevi

Za numerički rad koji zahtijeva imaginarne komponente, Python ima tip complex s literalima sa sufiksom j (1 + 2j). Modul cmath zrcali math za kompleksne ulaze. Oba su prisutna u većini MicroPython izgradnji, ali su rijetko potrebna za rad s kamerom; spominjemo ih uglavnom zato da ne budu iznenađenje ako prenosite kod koji ih koristi.