Python中的分数类

我想在Python中建立一个分数类。下面是它应该做的一些事情:

frac类需要什么来创建新分数?当然分子和分母。因此,在init方法中,您将设置两个属性numer和denom。 如果用户尝试使用非整数的数字和小数创建分数,则抛出错误。这是执行此操作的很酷的代码行:assert(numer,int)和assert(denom,int)。在assert语句中,必须在assert后面跟随一个布尔表达式。如果该布尔值为True,则什么也不会发生。但是如果为False,代码将停止执​​行并退出并显示错误消息。

创建后应自动减少分数。这意味着您需要一个辅助函数来减少它。那是最大的共同因素(您在上一章中已经写过);减少分数意味着将其顶部和底部除以(//除以)其GCF。

如果仅将一个int发送给init,则假定它是分子,并且分母为1。 我建议您将负分数存储为正分母上的负分子。是的 如果向init发送了两个负整数,则将分子和分母都设置为正。

您将覆盖各种内置运算符-+表示加法,-表示减法,*表示乘法,/表示除法,**表示幂运算,==表示相等比较。请记住,要做到这一点,您将需要使用双下划线功能add,sub等。这应该会有所帮助。

要加或减,您需要找到一个公分母。您可以为此使用最小公倍数。 (您可以但不需要。您真正需要的只是一个公倍数;而获得这一结果的肯定方法是乘以分母。但这并不妙!)您在上一章中写道LCM。

将小数提高到整数幂应返回小数。提升到非整数幂的分数应引发异常。 如果它们的叉积相等,则两个分数相等。您还可以定义小于和大于叉积。我会让您知道如何精确地做到这一点。

在您的函数中,只有一个将返回字符串。那是当然的。其余的将返回数字。的确,大多数将返回断层。 (是的,这意味着在您的大多数函数中,您将构建并返回frac。) 您的代码应处理int或float在左侧或右侧的情况。例如,它应该同时处理frac + int和int + frac。

研究radd,rsub,rmul和rtruediv。

这是代码应如何开始的:

import frac

print('A Few Fractions')
f1 = frac.frac(12, 15) # Reduce to 4/5
f2 = frac.frac(27, 8) # Irreducible
f3 = frac.frac(5, -2) # Neg fraction is always neg numer over pos denom
f4 = frac.frac(-5, -2) # Represent as 5/2
f5 = frac.frac(42) # Represent as 42/1
f6 = frac.frac(0) # Represent as 0/1
print(f1, f2, f3, f4, f5, f6)
print(type(f1), type(f5)) # Should be type frac.
print()

print("Negation and Absolute Value")
print(-f1, --f1)
print(abs(f1), abs(f3))
print()

print('Two-Frac Operations')
f1 = frac.frac(1, 2)
f2 = frac.frac(-2, 3)
print(f1, '+', f2, '=', f1 + f2)
print(f1, '-', f2, '=', f1 - f2)
print(f1, '*', f2, '=', f1 * f2)
print(f1, '/', f2, '=', f1 / f2)
print(f1, '** 3 =', f1 ** 3)
print(f1, '** -3 = ', f1 ** -3)
print()

print('Chained Operations')
f3 = frac.frac(5, 4)
print(f1, '+', f2, '*', f3, '=', f1 + f2 * f3)
print(f3, '/', f1, '-', f3, '=', f3 / f1 - f3)
print()

print('Operations with Ints and Floats')
# Handle a non-frac on the left and on the right
print('3 + ', f2, '=', 3 + f2)
print('3.0 + ', f2, '=', 3.0 + f2)
print(f2, '+ 3 =', f2 + 3)
print(f2, '+ 3.0 =', f2 + 3.0)
print('3 - ', f2, '=', 3 - f2)
print('3.0 - ', f2, '=', 3.0 - f2)
print(f2, '- 3 =', f2 - 3)
print(f2, '- 3.0 =', f2 - 3.0)
print('3 *', f2, '=', 3 * f2)
print('3.0 *', f2, '=', 3.0 * f2)
print(f2, '* 3 =', f2 * 3)
print(f2, '* 3.0 =', f2 * 3.0)
print('3 /', f2, '=', 3 / f2)
print('3.0 /', f2, '=', 3.0 / f2)
print(f2, '/ 3 =', f2 / 3)
print(f2, '/ 3.0 =', f2 / 3.0)
print()

print('Comparison')
f1 = frac.frac(2, 3)
f2 = frac.frac(3, 4)
print(f1 == f1, f1 != f1, f1 != f2)
print(f1 == 1, 1 == f1, f1 != 1, 1 != f1, f2 == 0.75, 0.75 == f2, f2 != 0.75, 0.75 != f2)
print(f1 < f2, f2 < f1, f1 < 1, f1 < 1.0, f1 <= f1, f2 <= f1, f2 <= 0.75, f2 <= 0.7)
print()

print("Type Conversion")
f1 = frac.frac(2, 3)
f2 = frac.frac(15, 4)
print(float(f1), float(f2))
print(int(f1), int(f2))
print()

print("Nasty fracs")
f1 = frac.frac(127, 2985)
f2 = frac.frac(3981, 371)
print(f1 ** 2 + f2)
f3 = frac.frac(1, 2)
f4 = frac.frac(2, 3)
f5 = frac.frac(3, 4)
print((f3 ** 2 + f4 ** 3) / (f5 - 5))
f6 = frac.frac(510510, 44100)
f7 = frac.frac(6636630, 573302)
print(f6 == f7, f6 < f7, f6 > f7, f6 - f7, float(f6 - f7))

代码输出方式如下:

A Few Fractions
4/5 27/8 -5/2 5/2 42/1 0/1
<class 'frac.frac'> <class 'frac.frac'>

Negation and Absolute Value
-4/5 4/5
4/5 5/2

Two-Frac Operations
1/2 + -2/3 = -1/6
1/2 - -2/3 = 7/6
1/2 * -2/3 = -1/3
1/2 / -2/3 = -3/4
1/2 ** 3 = 1/8
1/2 ** -3 =  8/1

Chained Operations
1/2 + -2/3 * 5/4 = -1/3
5/4 / 1/2 - 5/4 = 5/4

Operations with Ints and Floats
3 +  -2/3 = 7/3
3.0 +  -2/3 = 2.3333333333333335
-2/3 + 3 = 7/3
-2/3 + 3.0 = 2.3333333333333335
3 -  -2/3 = 11/3
3.0 -  -2/3 = 3.6666666666666665
-2/3 - 3 = -11/3
-2/3 - 3.0 = -3.6666666666666665
3 * -2/3 = -2/1
3.0 * -2/3 = -2.0
-2/3 * 3 = -2/1
-2/3 * 3.0 = -2.0
3 / -2/3 = -9/2
3.0 / -2/3 = -4.5
-2/3 / 3 = -2/9
-2/3 / 3.0 = -0.2222222222222222

Comparison
True False True
False False True True True True False False
True False True True True False True False

Type Conversion
0.6666666666666666 3.75
0 3

Nasty fracs
35477589584/3305693475
-59/459
False False True 2431/60196710 4.038426684780613e-05

这不是家庭作业,它只是我在网上找到的一个项目,目的是帮助更好地了解python中的分数。同样,这不是重复,因为我在问如何解决这个特定问题,而不是整个构建分数类。

评论