文章目录
- 一、前言
- 实验所需的库
- 终端指令
- Fraction类
- 1. Fraction(numerator, denominator):
- 2. Fraction(numerator)
- 3. Fraction()
- 4. 分数作参数
- 5. 负分数作参数
- 6. 字符串作参数
- 7. 小数作参数
- 8. 科学计数法
- 9. 浮点数作参数
- ==10. 浮点数精度问题==
- 11. Decimal对象作参数
- 二、实现过程
- Version 1 四则运算
- Version 2 试题list
- Version 3 可视化
- Problems
- Answers
- Version 4 排除负数
本文记录了Fraction类使用方法,并实现了分数加减乘除运算生成“试卷”
一、前言
实验所需的库
from fractions import Fraction
import random
from PIL import Image, ImageDraw, ImageFont
- 标准库中的
random
模块包含用于生成随机数的函数 fractions
模块包含用于处理分数的Fraction
类
终端指令
conda create -n DL python==3.11
conda activate DL
conda install numpy pillow
或
pip install numpy pillow
Fraction类
当调用Fraction
函数时,有几种可能的参数类型:
1. Fraction(numerator, denominator):
使用整数作为分子和分母创建一个分数。在这里,Fraction(16, -10)
创建了一个分数,分子为16,分母为-10。由于分母为负数,Fraction对象会自动将其转换为正数,结果为Fraction(-8, 5)。
Fraction(16, -10)
输出: Fraction(-8, 5)
2. Fraction(numerator)
如果只提供一个参数,Fraction对象会将其作为分子,分母默认为1。
Fraction(123)
输出: Fraction(123, 1)
3. Fraction()
如果没有提供参数,则使用默认值0/1。
Fraction()
输出: Fraction(0, 1)
4. 分数作参数
传入字符串作为参数,Fraction会尝试解析该字符串来创建分数。
Fraction('3/7')
输出: Fraction(3, 7)
5. 负分数作参数
与前一个例子类似,Fraction会去除字符串中的空格并解析分数。
Fraction(' -3/7 ')
输出: Fraction(-3, 7)
6. 字符串作参数
同样,Fraction会尝试解析字符串中的数字来创建分数,忽略其他字符。
Fraction('1.414213 \t\n')
输出: Fraction(1414213, 1000000)
7. 小数作参数
与前面的例子类似,Fraction会解析负小数来创建分数。
Fraction('-.125')
输出: Fraction(-1, 8)
8. 科学计数法
Fraction也支持科学计数法表示的小数。
Fraction('7e-6')
输出: Fraction(7, 1000000)
9. 浮点数作参数
如果参数是浮点数,Fraction对象会将其转换为最接近的分数。
Fraction(2.25)
输出: Fraction(9, 4)
10. 浮点数精度问题
浮点数1.1在计算机中以二进制形式表示时会产生精度损失:
Fraction(1.1)
输出: Fraction(2476979795053773, 2251799813685248)
11. Decimal对象作参数
同样,使用Decimal对象作为参数可以避免浮点数精度问题:
from decimal import Decimal
Fraction(Decimal('1.1'))
输出: Fraction(11, 10)
二、实现过程
Version 1 四则运算
import random
from fractions import Fractionnum1 = random.randint(1, 10)
num2 = random.randint(1, 10)
num3 = random.randint(1, 10)
num4 = random.randint(1, 10)operator = random.choice(['+', '-', '*', '/'])if operator == '+':result = Fraction(num1, num2) + Fraction(num3, num4)
elif operator == '-':result = Fraction(num1, num2) - Fraction(num3, num4)
elif operator == '*':result = Fraction(num1, num2) * Fraction(num3, num4)
elif operator == '/':result = Fraction(num1, num2) / Fraction(num3, num4)print(f"{num1}/{num2} {operator} {num3}/{num4} = {result}")
首先通过生成四个 1~10 之间的随机整数,然后再随机选择运算符,最后用 Fraction
表达式进行四则运算并输出结果。
num1 = random.randint(1, 10)
: 通过random.randint
函数生成一个 1~10 之间的随机整数赋值给num1
。num2
、num3
和num4
的表示方式类似。operator = random.choice(['+', '-', '*', '/'])
: 通过random.choice
选择'+'
、'-'
、'*'
、'/'
中的一个赋值给operator
。Fraction(num1, num2)
:Fraction
类构造函数生成一个分数对象,分子为num1
,分母为num2
。- 根据
operator
的值,使用Fraction
类的四则运算符进行相应的计算,结果赋值给result
。 - 使用 f-string 格式化输出,打印出分数表达式及其计算结果。
例如:
Version 2 试题list
from fractions import Fraction
import random
from PIL import Image, ImageDraw, ImageFontnum = 0problems = []
answers = []
max_range = 100
for i in range(100):num1 = random.randint(1, max_range)num2 = random.randint(1, max_range)num3 = random.randint(1, max_range)num4 = random.randint(1, max_range)operator = random.choice(['+', '-', '*', '/'])if operator == '+':result = Fraction(num1, num2) + Fraction(num3, num4)elif operator == '-':result = Fraction(num1, num2) - Fraction(num3, num4)elif operator == '*':result = Fraction(num1, num2) * Fraction(num3, num4)else: # Divisionresult = Fraction(num1, num2) / Fraction(num3, num4)problem = f"{num1}/{num2} {operator} {num3}/{num4} = "# print(f"{num1}/{num2} {operator} {num2}/{num1} = ")problems.append(problem)answers.append(str(result))print(problem)
改进版:
-
增加了一个循环,用于生成 100 个不同的问题。
-
将问题和答案都添加到了两个不同的列表中。
Version 3 可视化
from fractions import Fraction
import random
from PIL import Image, ImageDraw, ImageFontproblems = []
answers = []
max_range = 10
for i in range(100):num1 = random.randint(1, max_range)num2 = random.randint(1, max_range)num3 = random.randint(1, max_range)num4 = random.randint(1, max_range)operator = random.choice(['+', '-', '*', '/'])if operator == '+':result = Fraction(num1, num2) + Fraction(num3, num4)elif operator == '-':result = Fraction(num1, num2) - Fraction(num3, num4)elif operator == '*':result = Fraction(num1, num2) * Fraction(num3, num4)else: # Divisionresult = Fraction(num1, num2) / Fraction(num3, num4)problem = f"{num1}/{num2} {operator} {num3}/{num4} = "# print(f"{num1}/{num2} {operator} {num2}/{num1} = ")problems.append(problem)answers.append(str(result))print(problem)num = 20
text_y = 50
font = ImageFont.truetype("arial.ttf", 25)problem_image = Image.new('RGB', (800, 1200), color='white')
draw = ImageDraw.Draw(problem_image)
draw.text((300, 20), 'Math Problems', fill='blue', font=font)
for i in range(num):draw.text((50, text_y), problems[i], fill='black', font=font)text_y += 50problem_image.save('math_problems_7.png')text_y = 50
answer_image = Image.new('RGB', (800, 1200), color='white')
draw = ImageDraw.Draw(answer_image)
draw.text((300, 20), 'Math Answers', fill='blue', font=font)
for i in range(num):draw.text((50, text_y), f"{problems[i]} = {answers[i]}", fill='black', font=font)text_y += 50answer_image.save('math_answers_7.png')
使用Image
模块创建白底图片,并设置了真实字体以及颜色。然后将生成的问题和答案添加到了图片中,并保存为png文件。
Problems
Answers
Version 4 排除负数
from fractions import Fraction
import random
from PIL import Image, ImageDraw, ImageFontproblems = []
answers = []
max_range = 10
for i in range(100):num1 = random.randint(1, max_range)num2 = random.randint(1, max_range)num3 = random.randint(1, max_range)num4 = random.randint(1, max_range)operator = random.choice(['+', '-', '*', '/'])if operator == '+':result = Fraction(num1, num2) + Fraction(num3, num4)elif operator == '-':if Fraction(num1, num2) < Fraction(num3, num4):num1, num3 = num3, num1num2, num4 = num4, num2# print(num1, num2, num3, num4)result = Fraction(num1, num2) - Fraction(num3, num4)elif operator == '*':result = Fraction(num1, num2) * Fraction(num3, num4)else: # Divisionresult = Fraction(num1, num2) / Fraction(num3, num4)problem = f"{num1}/{num2} {operator} {num3}/{num4} = "# print(f"{num1}/{num2} {operator} {num2}/{num1} = ")problems.append(problem)answers.append(str(result))print(problem)num = 20
text_y = 50
font = ImageFont.truetype("arial.ttf", 25)problem_image = Image.new('RGB', (800, 1200), color='white')
draw = ImageDraw.Draw(problem_image)
draw.text((300, 20), 'Math Problems', fill='blue', font=font)
for i in range(num):draw.text((50, text_y), problems[i], fill='black', font=font)text_y += 50problem_image.save('math_problems_7.png')text_y = 50
answer_image = Image.new('RGB', (800, 1200), color='white')
draw = ImageDraw.Draw(answer_image)
draw.text((300, 20), 'Math Answers', fill='blue', font=font)
for i in range(num):draw.text((50, text_y), f"{problems[i]} {answers[i]}", fill='black', font=font)text_y += 50answer_image.save('math_answers_7.png')