2.3. Operazioni matematiche#
Python funziona come una calcolatrice fin da subito. Questa pagina copre gli operatori che userai più spesso: aritmetica sui numeri, confronti che producono valori booleani, operatori logici che combinano condizioni e operatori bit a bit per il lavoro a livello hardware.
2.3.1. Aritmetica#
Gli operatori aritmetici standard sui valori int e float:
+– addizione-– sottrazione (oppure negazione, come prefisso:-x)*– moltiplicazione/– divisione. Restituisce sempre unfloat, anche quando entrambi gli operandi sono interi.//– divisione intera. Restituisce il quoziente intero arrotondato verso meno infinito.%– modulo (resto).**– elevamento a potenza (2 ** 10è 1024).
>>> 7 / 2
3.5
>>> 7 // 2
3
>>> -7 // 2
-4
>>> 7 % 2
1
>>> 2 ** 16
65536
L’aritmetica a tipi misti promuove automaticamente gli interi a float:
>>> 3 + 0.5
3.5
L’assegnazione aumentata combina l’operatore con = per un aggiornamento compatto sul posto:
counter = 0
counter += 1 # equivalent to counter = counter + 1
counter *= 2 # works for *= /= //= %= **= too
La precedenza degli operatori segue l’ordine convenzionale: prima **, poi il - unario, poi *, /, // e %, infine + e -. Usa le parentesi quando hai dubbi – non costano nulla in fase di esecuzione.
2.3.2. Confronto#
Gli operatori di confronto restituiscono un bool (True o False):
==e!=– uguale / diverso.<,<=,>,>=– ordinamento.
>>> 3 == 3
True
>>> 3 == 3.0
True
>>> 3 < 5 <= 5
True
L’ultimo esempio è un confronto concatenato ed è esattamente equivalente a 3 < 5 and 5 <= 5.
Avvertimento
= assegna; == confronta. L’espressione if x = 5: è un errore di sintassi proprio perché Python si rifiuta di confondere silenziosamente i due.
2.3.3. Logica booleana#
Tre operatori combinano i booleani:
and–Truesolo quando entrambi i lati sono veri.or–Truequando uno dei due lati è vero.not– inverte un singolo booleano.
and e or operano in cortocircuito: smettono di valutare non appena il risultato è noto. False and slow_check() non chiama mai slow_check.
and e or restituiscono inoltre uno dei loro operandi anziché un letterale True o False, il che ti consente di scrivere valori predefiniti in modo compatto:
name = user_name or "anonymous" # "" / 0 / None are falsy
2.3.4. Operatori bit a bit#
Per il lavoro hardware – impacchettare campi di registro, mascherare bit, analizzare intestazioni di protocollo – ricorrerai agli operatori bit a bit. Agiscono sulla rappresentazione binaria di un int:
&– AND bit a bit|– OR bit a bit^– XOR bit a bit~– NOT bit a bit (complemento a uno)<<– scorrimento a sinistra>>– scorrimento a destra
Le forme letterali esadecimali e binarie sono comode per leggere e scrivere questi valori:
>>> 0b1100 & 0b1010
8 # 0b1000
>>> 0b1100 | 0b1010
14 # 0b1110
>>> 0xFF ^ 0x0F
240 # 0xF0
>>> 1 << 8
256
>>> (0xABCD >> 8) & 0xFF
171 # extract the high byte
Per ciascuno esistono le forme aumentate: |=, &=, ^=, <<=, >>=.
Nota
and / or operano sui booleani (o sulla veridicità); & / | operano sui bit. Non confonderli. 0b1100 and 0b1010 si valuta come 0b1010 perché entrambi gli operandi sono veri – non quello che di solito vuoi quando manipoli i bit.
2.3.5. Funzioni integrate utili per i numeri#
Una manciata di funzioni integrate copre operazioni numeriche comuni che i soli operatori non coprono:
round()– l’intero più vicino, oppure il numero più vicino conndigitscifre decimali quando viene fornito un secondo argomento. Restituisce unintperround(x)e unfloatperround(x, n). I casi di parità (0.5,1.5, …) vengono arrotondati al numero pari più vicino, non sempre per eccesso.divmod()– restituisce(quotient, remainder)in un’unica chiamata. Comodo per suddividere una quantità in unità (secondi in minuti-e-secondi, byte in pagine-e-offset).pow()– equivale a**nella forma a due argomenti. La forma a tre argomentipow(base, exp, mod)calcola(base ** exp) % modsenza mai materializzare il gigantesco valore intermedio, il che è l’unico modo pratico per eseguire l’esponenziazione modulare con esponenti di grandi dimensioni.
>>> 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
Le conversioni da intero a stringa in basi diverse (bin, oct, hex) sono trattate in Metodi e formattazione delle stringhe.
2.3.6. Il modulo math#
Le funzioni matematiche comuni risiedono nel modulo math. Importalo una volta e chiama le sue funzioni tramite un nome puntato:
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
Il modulo math di MicroPython copre i soliti noti (sqrt, exp, log, sin, cos, tan, atan2, floor, ceil, pi, e, …). Per i numeri casuali, vedi il modulo random; per la manipolazione di bit in virgola fissa, gli operatori sopra sono di solito sufficienti.
2.3.7. Numeri complessi#
Per il lavoro numerico che richiede componenti immaginarie, Python ha un tipo complex con letterali a suffisso j (1 + 2j). Il modulo cmath rispecchia math per gli input complessi. Entrambi sono presenti nella maggior parte delle build di MicroPython ma raramente necessari per il lavoro con la camera; li menzioniamo principalmente affinché non siano una sorpresa se porti codice che li utilizza.