Gli operatori sono solo simboli per delle azioni
Un operatore è un simbolo (o una breve parola chiave) che dice a Python di fare qualcosa con uno o due valori: sommarli, confrontarli, verificare se uno contiene l'altro. Ne conosci già qualcuno dalla matematica di base; Python ne ha qualcuno in più per la logica, l'appartenenza e l'identità.
Vediamo le categorie principali una alla volta.
Operatori aritmetici
Gli operatori matematici standard, più un paio di specialità di Python:
Due elementi di questo elenco si dimenticano facilmente:
/restituisce un float anche quando entrambi i lati sono interi.10 / 2ti dà5.0. Per la divisione intera, usa//.%è il modulo.n % 2 == 0è il modo più pulito per verificare senè pari.
Python segue la precedenza standard della matematica: ** ha precedenza su * e /, che a loro volta hanno precedenza su + e -. Le parentesi scavalcano tutto:
Usa le parentesi senza risparmio quando hai anche solo un dubbio. Non costano nulla e rendono evidente l'intenzione.
Operatori di confronto
Sei confronti, ognuno dei quali restituisce un booleano:
Python ti permette di concatenare i confronti, cosa insolita e utile:
Si legge "age è almeno 18 e minore di 65". Dietro le quinte equivale a 18 <= age and age < 65, ma si legge più come in matematica.
Operatori logici
Si scrivono come parole inglesi, non con simboli:
Due dettagli da conoscere:
Valutazione in cortocircuito. and si ferma al primo valore falsy; or si ferma al primo valore truthy. Il lato destro non viene nemmeno valutato se il lato sinistro decide già la risposta. Questo ti permette di proteggerti dagli errori in modo sicuro:
and/or restituiscono il valore, non sempre True/False. Restituiscono l'operando che ha deciso il risultato:
Nel codice reale vedrai name = user_input or "anonymous": è uno schema per i valori predefiniti basato proprio su questo comportamento.
Per le regole complete su questi tre operatori, compresi quali valori contano come falsy, come si ordinano tra loro not, and e or e perché and non è la stessa cosa di &, leggi and, or, not in Python.
Operatori di assegnazione
= assegna. Le forme composte uniscono un'operazione all'assegnazione:
Le forme composte funzionano anche con le stringhe (s += "more") e con le liste (lst += [4, 5]). Non sono più veloci della forma estesa; sono solo più corte.
Appartenenza: in e not in
Verificano se un valore compare all'interno di un contenitore:
in funziona su qualsiasi iterabile: liste, tuple, set, stringhe, dict e altro ancora. Per le ricerche su grandi quantità di dati, in su una lista è O(n); in su un set o un dict è O(1). Fa la differenza quando controlli l'appartenenza molte volte.
Identità: is e is not
is verifica se due variabili puntano allo stesso oggetto in memoria, non solo a valori uguali:
Quasi sempre ti serve ==. L'unico caso in cui is dà davvero il meglio è il confronto con None, True e False:
La convenzione della comunità è netta: is None, non == None. Lo stesso vale per is True (anche se raramente ti serve).
Operatori bit a bit (saltali alla prima lettura)
Python ha anche operatori bit a bit (&, |, ^, ~, <<, >>) per manipolare i singoli bit di un intero. Sono utili in crittografia, nella programmazione di rete a basso livello e in certi algoritmi. Alla prima lettura puoi tranquillamente ignorarli.
L'operatore walrus (:=)
Python 3.8 ha aggiunto :=, che assegna e restituisce un valore in una sola espressione. È utile nelle condizioni in cui vuoi sia catturare sia verificare un risultato:
Senza il walrus, chiameresti len(numbers) due volte oppure aggiungeresti una riga in più. Non è indispensabile; usalo dove riduce le ripetizioni.
Promemoria sulla precedenza degli operatori
Dalla precedenza più alta alla più bassa, per gli operatori che userai davvero:
**: elevamento a potenza*,/,//,%: moltiplicazione e divisione+,-: addizione e sottrazione<,<=,>,>=,==,!=: confrontinotandor
Nel dubbio, metti le parentesi. La chiarezza batte l'astuzia.
Domande frequenti
Quali sono i principali tipi di operatori in Python?
Aritmetici (+, -, *, /, //, %, **), di confronto (==, !=, <, <=, >, >=), logici (and, or, not), di assegnazione (=, +=, -=, …), di appartenenza (in, not in) e di identità (is, is not).
Che differenza c'è tra == e is in Python?
== verifica se due valori sono uguali. is verifica se due variabili fanno riferimento esattamente allo stesso oggetto in memoria. Per None, True e False usa is: sono singleton. Per tutto il resto, == è quasi sempre quello che vuoi.
Cosa fa l'operatore % in Python?
Con i numeri, % è l'operatore modulo: restituisce il resto di una divisione. 17 % 5 fa 2. Con le stringhe è una vecchia sintassi di formattazione (come "hello %s" % name), ma le f-string l'hanno in gran parte sostituita.