You can perform binary operations on a Fraction just like you can ints or floats!
Add two fractions:
>>> Fraction(1, 2) + Fraction(3, 4)
Fraction(5, 4)
So that's pretty great, but you can also mix in integers or floats. But as you might expect - adding an integer returns a Fraction object while adding a float returns a float.
>>> Fraction(5, 16) + 3
Fraction(53, 16)
>>> Fraction(5, 16) + 3.0
3.3125
Here are some examples of other binary operations:
>>> Fraction(5, 16) - Fraction(1, 4)
Fraction(1, 16)
>>> Fraction(1, 16) * Fraction(3, 16)
Fraction(3, 256)
>>> Fraction(3, 16) / Fraction(1, 8)
Fraction(3, 2)
Now let's try with exponentiation:
>>> Fraction(1, 8) ** Fraction(1, 2)
0.3535533905932738
It returns a float probably because the fraction is impossible to calculate within reason. We can actually use the limit_denominator method to get a semi-accurate Fraction as a result.
>>> f = Fraction(1, 8) ** Fraction(1, 2)
>>> Fraction(f).limit_denominator()
Fraction(235416, 665857)
Keep in mind you can mix in strings and other data types upon instantiation:
>>> Fraction("1/2") + Fraction(2.0)
Fraction(5, 2)
>>> Fraction(2) * Fraction(" 1/2 ")
Fraction(1, 1)