- Python offre i tipi numerici di base (int, float, complex, bool) oltre a potenti funzioni di supporto come math, cmath, decimal e random per i calcoli di tutti i giorni.
- Il modulo numbers definisce classi base astratte in modo che molti tipi numerici predefiniti, NumPy e personalizzati possano essere trattati uniformemente come istanze di Number.
- Le modalità di arrotondamento, i valori speciali (NaN, infiniti) e l'aritmetica decimale esatta tramite decimal sono cruciali per un codice scientifico e finanziario robusto.
- L'ecosistema numerico di Python, in particolare NumPy, estende i tipi di base con numeri interi a larghezza fissa e array ad alte prestazioni per calcoli complessi.
Lavorare con i numeri è alla base della maggior parte dei programmi Python.Che si tratti di creare un semplice script, elaborare dati scientifici o prototipare un algoritmo, comprendere come Python rappresenta e manipola i valori numerici è il primo passo per scrivere codice affidabile ed efficiente che si comporti come previsto.
Quando si parla di "Python numerico" spesso ci si riferisce a due cose: da un lato, i tipi numerici integrati e gli strumenti della libreria standard come math, cmath, decimal, random e numbersDall'altro lato, c'è il più ampio ecosistema che ruota attorno al calcolo numerico, con librerie come NumPy che estendono il linguaggio con tipi numerici aggiuntivi e operazioni vettorializzate. Questa guida illustra in dettaglio tali basi, dai tipi di base alle astrazioni avanzate.
Tipi numerici di base in Python
Python definisce diverse categorie numeriche integrate che coprono la maggior parte delle esigenze quotidiane: numeri interi per i numeri interi, numeri in virgola mobile per i valori reali con decimali, numeri complessi per i valori con parte reale e immaginaria e lo speciale tipo booleano che si comporta come un membro molto piccolo della famiglia degli interi. Tutti si integrano perfettamente con gli operatori aritmetici di Python.
Numeri interi (int) rappresentano numeri interi, positivi o negativi, senza virgola decimale. Non esiste un limite superiore fisso per le loro dimensioni in Python standard; finché hai memoria, il tuo intero può crescere. Valori come 1, -5 or 20234567890123456789 sono tutti validi int casi, e puoi confermarlo con type(1) or type(-5), che restituirà <class 'int'>.
Numeri in virgola mobile (float) vengono utilizzati per i numeri reali con una componente frazionariaSono scritti con una virgola decimale, come ad esempio 2.0, -7.823457 or 0.5, oppure con notazione scientifica come 1e8 (che significa 100,000,000). Quando si eseguono operazioni come la divisione, anche tra numeri interi, Python spesso promuove il risultato a un float; per esempio, 9 / 2 i rendimenti 4.5e type(4.5) is <class 'float'>.
Numeri complessi (complex) combinare una parte reale e una parte immaginaria, scritto con una parte finale j per l'unità immaginaria. Un valore come 2 + 3j ha una componente reale 2 e una componente immaginaria 3. Puoi costruirle direttamente (ad esempio 3.14j) e ispezionarli con attributi quali .real e .imag, oppure chiama .conjugate() per ottenere il coniugato complesso. Questi sono particolarmente diffusi in ingegneria, elaborazione del segnale e calcolo scientifico.
Booleani (bool) sono tecnicamente numerici, perché True e False si comportano come gli interi 1 e 0 nelle espressioni aritmetiche. Ad esempio, True + 2 valuta a 3. Internamente, bool è una sottoclasse di intEcco perché i valori booleani si integrano perfettamente nei calcoli e nei confronti.
Python permette di combinare liberamente questi tipi numerici nelle espressioni., promuovendo a un tipo più generale quando necessario. Aggiungendo un int ad uno float produce a floate la combinazione di numeri in virgola mobile con numeri complessi produce un risultato complesso: espressioni come 1 + 1.0, 2.0 + (3 + 5j) or 6 / (5 + 8j) tutto funziona senza particolari cerimonie.

Operatori aritmetici e comportamento della divisione
Una volta ottenuti i valori numerici, si utilizzano i normali operatori aritmetici per elaborarli.: aggiunta (+), sottrazione (-), moltiplicazione (*), divisione (/), divisione del piano (//), esponenziazione (**) e modulo (%Python applica queste operazioni a numeri interi, numeri in virgola mobile e numeri complessi, eseguendo la promozione del tipo quando necessario.
La divisione è un'area in cui la progettazione di Python è molto mirata. utilizzando / restituisce sempre un risultato in virgola mobile quando entrambi gli argomenti sono numerici, anche se sono entrambi interi. Quindi 9 / 2 risultati in 4.5non, 4Questo ti incoraggia a pensare per impostazione predefinita in termini di divisione con numeri reali, che è solitamente ciò che si desidera nei calcoli scientifici o finanziari.
Se hai bisogno di una divisione intera che scarti la parte frazionaria, usi l'operatore di divisione intera. //. Per esempio, 9 // 2 produce 4e -9 // 2 i rendimenti -5, poiché il risultato è arrotondato per difetto (verso meno infinito). Inoltre, divmod(a, b) ti dà sia il quoziente che il resto allo stesso tempo, restituendo una coppia che riflette (a // b, a % b).
Dietro le quinte, Python coordina attentamente il modo in cui interagiscono i diversi tipi di valori numerici.Un modello interno che si può osservare nella libreria standard è l'idea di "fallback degli operatori": funzioni che prima provano un'implementazione specifica per il tipo, ad esempio per i numeri razionali, poi ricorrono agli operatori predefiniti quando un operando è un numero normale. int, float or complex. Questo è ciò che permette ai tipi numerici personalizzati di interagire con il sistema aritmetico di Python utilizzando metodi speciali come __add__ e __radd__.
Codice di libreria per l'aritmetica razionale, come ad esempio Fraction tipo, illustra chiaramente questa strategia. Quando si aggiungono due Fraction in alcuni casi, calcola una nuova frazione moltiplicando incrociatamente numeratori e denominatori. Se aggiungi un Fraction a un numero intero semplice o a un'istanza di numbers.Rational, utilizza l'algoritmo razionale preciso. Se l'altro operando è un float or complex, verrà convertito in quel tipo più ampio e delegherà agli operatori regolari, mantenendo il comportamento coerente e intuitivo.
Funzioni numeriche integrate
Oltre agli operatori grezzi, Python include una serie di funzioni integrate che sanno come gestire i numeri.Queste funzioni sono sempre disponibili senza bisogno di importare nulla e funzionano con i tipi numerici standard, oltre che con qualsiasi oggetto personalizzato che implementi i metodi speciali appropriati.
abs(x) restituisce il valore assoluto del suo argomento, rendendo positivi i numeri negativi e lasciando invariati i valori positivi. Se passi un oggetto che definisce __abs__(), Python delegherà a quel metodo. Per i numeri complessi, abs() restituisce la magnitudine (la distanza dall'origine nel piano complesso).
round(x, ndigits) restituisce un valore arrotondato a un determinato numero di cifre decimali.. Se ndigits è omesso o None, restituisce l'intero più vicino. A differenza della regola scolastica "arrotonda per eccesso", la funzione integrata di Python round Utilizza una strategia di "arrotondamento per difetto" per i casi di parità, al fine di ridurre la distorsione statistica nei calcoli ripetuti.
Funzioni di conversione come int() e float() costruire numeri a partire da altri oggetti. chiamata int(x) su un numero in virgola mobile scarta la parte frazionaria (ad esempio, int(1.9) is 1), E float(x) Genera una rappresentazione in virgola mobile da numeri interi, stringhe o oggetti compatibili. Quando si converte da float a int, non viene eseguito alcun arrotondamento; la parte decimale viene semplicemente troncata.
Altri elementi integrati svolgono ruoli di rappresentazione e aggregazione. Funzioni come hex() e oct() restituisce rappresentazioni in stringa di numeri interi in formato esadecimale o ottale con i prefissi appropriati (0x e 0o). Strumenti di aggregazione come max() e min() scansiona un iterabile o una serie di argomenti per trovare il valore più grande o più piccolo, mentre pow() e ** L'operatore calcola le potenze e, facoltativamente, accetta un terzo argomento per l'elevamento a potenza modulare.
Strumenti numerici avanzati: math, cmath e decimal.
Per calcoli più complessi, Python fornisce moduli dedicati della libreria standard. invece di appesantire il linguaggio di base. I più importanti per il lavoro numerico sono math, cmath e decimal, ciascuno mirato a un particolare sottoinsieme di problemi.
Migliori math Il modulo si concentra sulla matematica a virgola mobile a valori reali.. Dopo averlo importato con import math, si ottiene l'accesso a funzioni e costanti comunemente necessarie in ingegneria, fisica e analisi quotidiane, tutte implementate in codice C efficiente e operanti su float valori.
math include strumenti di teoria dei numeri e di rappresentazione come math.ceil() per arrotondare all'intero più vicino, math.floor() per arrotondare per difetto, math.modf() per suddividere un numero decimale in parti frazionarie e intere, e math.frexp() / math.ldexp() per lavorare con la rappresentazione binaria interna. Fornisce anche routine di potenza e logaritmiche come math.exp(), math.log(), math.log10(), math.pow() e math.sqrt(), nonché funzioni trigonometriche e iperboliche come math.sin(), math.cos(), math.tan(), math.asin(), math.acos(), math.atan(), math.atan2(), math.sinh(), math.cosh() e math.tanh().
Per comodità, math esporta costanti fondamentali come math.pi e math.eQuesti sono utili ogni volta che si calcolano aree, angoli o crescita esponenziale e si desiderano valori coerenti con una buona precisione in tutta la base di codice.
Quando devi lavorare con numeri complessi, il cmath il modulo svolge lo stesso ruolo per il piano complesso. La sua API rispecchia math ma utilizza argomenti complessi e restituisce risultati complessi, quindi è possibile calcolare esponenziali complessi, logaritmi e funzioni trigonometriche senza dover scomporre manualmente i numeri in parti reali e immaginarie.
Migliori decimal Il modulo si concentra su un problema diverso: l'aritmetica esatta in base 10.. La virgola mobile binaria standard non può rappresentare con precisione molte frazioni decimali, quindi calcoli come 0.1 + 0.2 produrre un risultato leggermente diverso. decimal.Decimal aggira questo problema utilizzando l'aritmetica in base 10 a precisione arbitraria, il che la rende ideale per le applicazioni finanziarie e ovunque sia necessario controllare in modo molto preciso il comportamento di arrotondamento.
Per impostazione predefinita, le operazioni in virgola mobile di Python seguono il comportamento IEEE-754 e utilizzano la rappresentazione in base 2.Quando un valore si trova esattamente a metà tra due numeri rappresentabili, viene applicato l'arrotondamento "per eccesso", ovvero metà dei casi di parità vengono arrotondati per difetto e metà per eccesso. Questo evita la deriva sistematica nei calcoli di grandi dimensioni. Se si desidera la semantica commerciale "arrotonda per eccesso", è possibile configurare un decimal contesto da utilizzare ROUND_HALF_UP, che sposta sempre i valori di 5 rispetto allo zero.
Lavorare con i tipi numerici nella pratica
Esplorare il comportamento interattivo dei numeri è un ottimo modo per sviluppare l'intuizione.Avvia l'interprete Python e crea un mix di numeri interi, numeri in virgola mobile e valori complessi, quindi prova a eseguire operazioni di base su di essi. L'addizione e la moltiplicazione sono semplici, ma è particolarmente istruttivo sperimentare con la divisione, la divisione intera, l'arrotondamento e le conversioni, osservando come cambia il tipo del risultato.
La conversione tra tipi numerici è talvolta necessaria per soddisfare le aspettative di un'API o per semplificare la logica.Se hai un numero in virgola mobile e vuoi solo la sua parte intera, assegnala a una variabile come my_float = 1.9 e poi chiama my_int = int(my_float). Stampa my_int dà 1e type(my_int) conferma che è un intTieni presente che la parte decimale viene scartata anziché arrotondata.
La direzione inversa, ovvero la promozione a un tipo più generale, spesso avviene implicitamenteQuando si sommano un numero intero e un numero in virgola mobile, Python restituisce automaticamente un numero in virgola mobile, poiché il sistema dei numeri reali contiene già gli interi. Lo stesso comportamento si verifica quando si combinano un numero in virgola mobile e un numero complesso: il valore in virgola mobile viene trattato come se avesse una parte immaginaria pari a zero e il risultato è un numero complesso.
I numeri complessi includono diverse comodità integrate che li rendono naturaliÈ possibile ispezionare direttamente a.real e a.imag per ottenere i componenti, chiamare a.conjugate() per capovolgere il segno della parte immaginaria e passarli alle funzioni in cmath senza conversione manuale. Anche se li usi raramente, sapere che esistono e come funzionano è utile quando ti imbatti in codice scientifico.
Accuratezza e precisione sono sempre fondamentali quando si ha a che fare con dati in virgola mobile.. La precisione effettiva di un Python standard float ha circa 15 cifre decimali; oltre a questo, la sedicesima cifra può essere inaffidabile. Per molte attività, questo è perfettamente accettabile, ma se hai bisogno di aritmetica decimale esatta o di un arrotondamento più prevedibile, decimal Questo modulo ti offre il controllo di cui hai bisogno, a scapito di alcune prestazioni.
Numeri casuali e valori numerici speciali
La generazione di numeri casuali è un'altra attività frequente nei flussi di lavoro numerici in Python., sia che tu stia costruendo giochi semplici, eseguendo simulazioni Monte Carlo o scrivendo casi di test che esercitano condizioni limite. La libreria standard random Il modulo fornisce le nozioni di base per tali scenari.
random.randint(a, b) produce un numero intero pseudo-casuale tra a e b, compreso. Ciò semplifica la simulazione del lancio dei dadi o la scelta di indici casuali in un elenco. Per i valori in virgola mobile, funzioni come random.random() e le funzioni di supporto correlate generano numeri casuali uniformi in intervalli come [0.0, 1.0), pronti per essere scalati o trasformati per la tua particolare distribuzione.
Python espone anche alcuni valori numerici che rappresentano quantità insolite o "casi limite".. Uno è NaN ("Not a Number"), ottenuto ad esempio chiamando float('nan')Il valore NaN indica risultati indefiniti o non rappresentabili, come ad esempio il risultato della divisione di zero per zero o dell'analisi di un campo numerico corrotto nei dati di input.
Oltre a NaN, Python supporta l'infinito positivo e negativo., costruito utilizzando float('inf') e float('-inf')Questi valori sono utili come valori sentinella quando si inizializzano le variabili per algoritmi che cercano valori minimi o massimi, oppure quando si modellano intervalli illimitati nei metodi numerici.
Lavorare con i valori NaN richiede particolare attenzione perché non si comportano come i numeri normali.. I confronti che coinvolgono NaN sono sempre falsi (anche nan == nan), e le operazioni aritmetiche con NaN tendono a propagare il NaN nel risultato. Sebbene questa guida non approfondisca la semantica di NaN, essere consapevoli delle sue peculiarità aiuta a eseguire il debug di pipeline di dati e algoritmi numerici in modo più efficace.
Gerarchie numeriche astratte con il modulo numeri
Man mano che il codice diventa più sofisticato, potrebbe essere necessario un metodo flessibile per riconoscere i valori "numerici". senza controllare manualmente ogni singolo tipo concreto (come int, float, complex e scalari NumPy). È qui che numbers Il modulo interviene fornendo una gerarchia astratta di tipi numerici.
Migliori numbers Il modulo definisce classi base astratte (ABC) che descrivono il comportamento numerico, come Number, Complex, Real, Rational e IntegralQueste classi non sono destinate a essere istanziate direttamente. Piuttosto, i tipi numerici concreti ereditano da esse per segnalare che implementano le operazioni e le proprietà richieste.
L'ABC più generale è numbers.Number, che rappresenta “qualsiasi tipo numerico”. Se vuoi verificare se una variabile deve essere trattata come numerica, magari durante il debug o quando scrivi piccoli script di utilità, puoi combinare isinstance con questo ABC. Ad esempio, isinstance(x, Number) problemi True per i tipi numerici integrati e molti tipi numerici esterni, come vari scalari NumPy.
Un esempio pratico utilizza i tipi NumPy insieme alle funzioni integrate di Python. Se importi NumPy come np e poi itera su valori come 1, 1., -0.2, 1e8, np.int64(1), np.int0(10), np.int16(2), np.float64(10), np.complex64(10) e np.int32(89), chiamando isinstance(value, Number) Per ciascuno di essi, vedrai che vengono tutti conteggiati come numerici. Questo ti evita di scrivere una lunga catena di controlli di tipo per ogni singola classe.
Vale la pena notare che isinstance di per sé è considerato un "odore" di codice quando usato eccessivamente. L'eccessiva dipendenza dal controllo esplicito dei tipi può segnalare problemi di progettazione più profondi in un programma orientato agli oggetti. Detto questo, per il debug rapido, gli script esplorativi o le piccole utilità, il controllo rispetto a numbers.Number è uno strumento potente e pragmatico per verificare che le variabili si comportino effettivamente come numeri.
Ecosistemi numerici estesi: NumPy e tipi personalizzati
Sebbene il nucleo di Python esponga solo un piccolo insieme di tipi numerici generici, l'ecosistema più ampio espande notevolmente le opzioni a disposizione.In particolare, NumPy introduce molte più opzioni numeriche progettate per il calcolo efficiente su array e matrici di grandi dimensioni.
NumPy definisce tipi interi a larghezza fissa come numpy.int64, numpy.int32, numpy.int16 e alias specializzati come numpy.int0Questi tipi di dati assomigliano a quelli presenti nei linguaggi di programmazione di basso livello orientati ai numeri, come Fortran e C, dove conoscere l'esatta dimensione di memorizzazione e il comportamento dei numeri è essenziale per le prestazioni e l'interoperabilità.
Oltre agli interi, NumPy offre tipi come numpy.float64 e numpy.complex64, insieme a molti altri, che si integrano perfettamente con array e ufunc (funzioni universali). Questi tipi di solito si registrano come istanze degli ABC appropriati da numbers modulo, motivo per cui i controlli vengono effettuati numbers.Number lavoro come illustrato in precedenza.
La progettazione di Python ha volutamente mantenuto il modello numerico di base semplice e accessibile.Invece di costringere ogni utente a gestire decine di tipi numerici distinti, si concentra su tre tipi numerici di base (più i booleani), rendendo al contempo semplice per le librerie specializzate estendere questo repertorio secondo necessità. Un ambiente orientato all'ingegneria, come quello creato da un'azienda di software di simulazione, si baserà naturalmente in larga misura su questi tipi estesi e sulle relative librerie.
Se costruisci le tue classi numeriche, seguendo gli schemi da numbers e fractions ti aiuta ad integrarti nell'ecosistema. Eseguendo la sottoclasse dell'ABC appropriato e implementando i metodi speciali richiesti (__add__, __radd__, __mul__(e così via), i tuoi tipi personalizzati possono interagire in modo naturale con gli operatori di Python, le funzioni numeriche integrate e altre librerie numeriche.
Nel complesso, numeric Python combina un sistema di tipi di base pulito, potenti moduli della libreria standard e un ricco ecosistema di librerie. Come NumPy, crea un ambiente in cui puoi passare agevolmente da semplici operazioni aritmetiche a calcoli ingegneristici avanzati. Una volta compreso come interi, numeri in virgola mobile, numeri complessi, valori speciali, regole di arrotondamento e classi numeriche astratte si integrano tra loro, puoi ragionare con maggiore sicurezza sul tuo codice, evitare bug difficili da individuare e scegliere gli strumenti più adatti per ogni attività numerica.