| Scopo | Implementa una classe per lavorare coi numeri razionali |
| Versione Python | 2.6 e superiore |
A partire dal 1 gennaio 2021 le versioni 2.x di Python non sono piu' supportate. Ti invito a consultare la corrispondente versione 3.x dell'articolo per il modulo fractions
La classe Fraction implementa le operazioni numeriche per i numeri razionali basate sull'API definita da Rational in numbers .
Come per decimal , i nuovi valori possono essere creati in diversi modi. Uno facile è quello di crearli da valori di numeratore e denominatore separati:
import fractions
for n, d in [ (1, 2), (2, 4), (3, 6) ]:
f = fractions.Fraction(n, d)
print '%s/%s = %s' % (n, d, f)
Il comune denominatore più basso viene mantenuto mentre vengono calcolati i nuovi valori.
$ python fractions_create_integers.py 1/2 = 1/2 2/4 = 1/2 3/6 = 1/2
Un altro modo per creare una frazione è usare una rappresentazione stringa di
<numeratore> / <denominatore>
import fractions
for s in [ '1/2', '2/4', '3/6' ]:
f = fractions.Fraction(s)
print '%s = %s' % (s, f)
$ python fractions_create_strings.py 1/2 = 1/2 2/4 = 1/2 3/6 = 1/2
Le stringhe possono anche usare la più comune notazione decimale o a virgola mobile di
[<cifre>].[<cifre>]
.
import fractions
for s in [ '0.5', '1.5', '2.0' ]:
f = fractions.Fraction(s)
print '%s = %s' % (s, f)
$ python fractions_create_strings_floats.py 0.5 = 1/2 1.5 = 3/2 2.0 = 2
Ci sono metodi di classe per creare istanze di Fraction direttamente da altre rappresentazioni di valori razionali tipo float o decimal .
import fractions
for v in [ 0.1, 0.5, 1.5, 2.0 ]:
print '%s = %s' % (v, fractions.Fraction.from_float(v))
Notare che, per i valori a virgola mobile che non possono essere espressi esattamente, la rappresentazione razionale potrebbe contenere risultati inaspettati.
$ python fractions_from_float.py 0.1 = 3602879701896397/36028797018963968 0.5 = 1/2 1.5 = 3/2 2.0 = 2
L'uso di rappresentazioni decimali dei valori fornisce il risultato che ci si aspetta.
import decimal
import fractions
for v in [ decimal.Decimal('0.1'),
decimal.Decimal('0.5'),
decimal.Decimal('1.5'),
decimal.Decimal('2.0'),
]:
print '%s = %s' % (v, fractions.Fraction.from_decimal(v))
$ python fractions_from_decimal.py 0.1 = 1/10 0.5 = 1/2 1.5 = 3/2 2.0 = 2
Una volta che le frazioni sono istanziate, possono essere usare in espressioni matematiche come ci si potrebbe aspettare.
import fractions
f1 = fractions.Fraction(1, 2)
f2 = fractions.Fraction(3, 4)
print '%s + %s = %s' % (f1, f2, f1 + f2)
print '%s - %s = %s' % (f1, f2, f1 - f2)
print '%s * %s = %s' % (f1, f2, f1 * f2)
print '%s / %s = %s' % (f1, f2, f1 / f2)
$ python fractions_arithmetic.py 1/2 + 3/4 = 5/4 1/2 - 3/4 = -1/4 1/2 * 3/4 = 3/8 1/2 / 3/4 = 2/3
Una utile caratteristica di Fraction è la capacità di convertire un numero a virgola mobile in un valore razionale approssimato limitando la dimensione del denominatore.
import fractions
import math
print 'PI =', math.pi
f_pi = fractions.Fraction(str(math.pi))
print 'Nessun limite =', f_pi
for i in range(1, 100, 5):
limited = f_pi.limit_denominator(i)
print '{0:8} = {1}'.format(i, limited)
$ python fractions_limit_denominator.py
PI = 3.14159265359
Nessun limite = 314159265359/100000000000
1 = 3
6 = 19/6
11 = 22/7
16 = 22/7
21 = 22/7
26 = 22/7
31 = 22/7
36 = 22/7
41 = 22/7
46 = 22/7
51 = 22/7
56 = 22/7
61 = 179/57
66 = 201/64
71 = 223/71
76 = 223/71
81 = 245/78
86 = 267/85
91 = 267/85
96 = 289/92