【python】Fraction类详解及生成分数四则运算“试卷”

文章目录

  • 一、前言
    • 实验所需的库
    • 终端指令
    • 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 Fraction

num1 = 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 之间的随机整数赋值给 num1num2num3num4的表示方式类似。
  • 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, ImageFont

num = 0

problems = []
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:  # Division
        result = 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, ImageFont

problems = []
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:  # Division
        result = 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 += 50

problem_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 += 50

answer_image.save('math_answers_7.png')

  使用Image模块创建白底图片,并设置了真实字体以及颜色。然后将生成的问题和答案添加到了图片中,并保存为png文件。

Problems

在这里插入图片描述

Answers

在这里插入图片描述

Version 4 排除负数

from fractions import Fraction
import random
from PIL import Image, ImageDraw, ImageFont

problems = []
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, num1
            num2, 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:  # Division
        result = 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 += 50

problem_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 += 50

answer_image.save('math_answers_7.png')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/384758.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣刷题之旅:高阶篇(三)—— 图算法的挑战

力扣&#xff08;LeetCode&#xff09;是一个在线编程平台&#xff0c;主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目&#xff0c;以及它们的解题代码。 --点击进入刷题地址 引言 在算法世界的深处&#xff0c;图算法犹如一座高峰&#xff…

基于大语言模型的AI Agents

代理&#xff08;Agent&#xff09;指能自主感知环境并采取行动实现目标的智能体。基于大语言模型&#xff08;LLM&#xff09;的 AI Agent 利用 LLM 进行记忆检索、决策推理和行动顺序选择等&#xff0c;把Agent的智能程度提升到了新的高度。LLM驱动的Agent具体是怎么做的呢&a…

Halcon 频域缺陷检测

文章目录 傅里叶变换频谱矩形圆菱形黑白相间的亮带去除图纹&#xff08;反傅里叶变换&#xff09;去除图纹滤波器处理 Halcon 频域空间域检测缺陷Halcon 频域差分空间域 缺陷检测&#xff08;lines_gauss 提取线&#xff09;Halcon 频域差分空间域&#xff08;blob特征&#xf…

C++实现二分查找

目录 例1 例2 例3 例4 例5 例6 例1 704. 二分查找 注意&#xff1a; ①left < right,这里的号是最后一次通过下标mid来判断 ②在偶数的时候mid&#xff0c;左右无所谓&#xff0c;因为left和right都有1&#xff1b; 参考代码 class Solution { public:int search…

【selenium】

selenium是一个Web的自动化测试工具&#xff0c;最初是为网站自动化测试而开发的。Selenium可以直接调用浏览器&#xff0c;它支持所有主流的浏览器。其本质是通过驱动浏览器&#xff0c;完成模拟浏览器操作&#xff0c;比如挑战&#xff0c;输入&#xff0c;点击等。 下载与打…

C++ Qt框架开发 | 基于Qt框架开发实时成绩显示排序系统(2)折线图显示

对上一篇的工作C学习笔记 | 基于Qt框架开发实时成绩显示排序系统1-CSDN博客继续优化&#xff0c;增加一个显示运动员每组成绩的折线图。 1&#xff09;在Qt Creator的项目文件&#xff08;.pro文件&#xff09;中添加对Qt Charts模块的支持&#xff1a; QT charts 2&#xf…

用HTML5 + JavaScript绘制花、树

用HTML5 JavaScript绘制花、树 <canvas>是一个可以使用脚本 (通常为JavaScript) 来绘制图形的 HTML 元素。 <canvas> 标签/元素只是图形容器&#xff0c;必须使用脚本来绘制图形。 HTML5 canvas 图形标签基础https://blog.csdn.net/cnds123/article/details/112…

opencv 图像色彩空间转化

今天看了b站贾志刚的课&#xff0c;觉得不错&#xff0c;特地做学习笔记来和小伙伴分享 贾志刚的这个好像是2.0版本,30小时的,语言更加精炼,适合初级入门学习 第一节是常规安装 看他的步骤装就行了,记得配置完点应用再点确定,我第一次就是 没点然后就失败了,又得重配置一次…

服务网格(Service Mesh)流行工具

在这篇博客中&#xff0c;我们将介绍微服务的最佳服务网格工具列表&#xff0c;这些工具提供安全性、金丝雀部署、遥测、负载均衡等。 用于部署和操作微服务的服务网格工具的数量不断增加。在这篇文章中&#xff0c;我们将探讨您应该用来构建自己的服务网格架构的顶级服务网格…

视觉开发板—K210自学笔记(五)

本期我们来遵循其他单片机的学习路线开始去用板子上的按键控制点亮LED。那么第一步还是先知道K210里面的硬件电路是怎么连接的&#xff0c;需要查看第二节的文档&#xff0c;看看开发板原理图到底是按键是跟哪个IO连在一起。然后再建立输入按键和GPIO的映射就可以开始变成了。 …

PHP特性知识点总结

description: 专门出的关于php的特性比较,后面好像也有java的特性。 大家直接去我的gitbook或者github看就能看到图片,这里就懒得把他弄到csdn上了。 这里放github和gitbook的链接,大家跳转就可以。gitbook链接用国内的网就能访问。 gitbook: http://22kaka.fun github:htt…

STM32 + ESP8266,连接阿里云 上报/订阅数据

&#xff08;文章正在编辑中&#xff0c;一点点地截图操作过程&#xff0c;估计要拖拉两三天&#xff09; 一、烧录MQTT固件 ESP8266出厂时&#xff0c;默认是AT固件。连接阿里云&#xff0c;需要使用MQTT固件。 1、独立EPS8266模块的烧录方法 2、魔女开发板&#xff0c;板载…

HTTP协议-请求Request

前言&#xff1a; 序列&#xff1a;HTTP - 002 1.请求格式 1.1标椎格式 HTTP请求是字符串的格式传输&#xff0c;具体包含以下四部分&#xff1a; 首行&#xff1a;[方法][url][版本号]&#xff0c;分别使用空格分隔&#xff1b;请求头&#xff08;Header&#xff09;&#…

apk反编译修改教程系列---简单修改apk默认横竖屏显示 手机端与电脑端同步演示【十一】

往期教程&#xff1a; apk反编译修改教程系列-----修改apk应用名称 任意修改名称 签名【一】 apk反编译修改教程系列-----任意修改apk版本号 版本名 防止自动更新【二】 apk反编译修改教程系列-----修改apk中的图片 任意更换apk桌面图片【三】 apk反编译修改教程系列---简单…

《UE5_C++多人TPS完整教程》学习笔记8 ——《P9 访问 Steam(Acessing Steam)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P9 访问 Steam&#xff08;Acessing Steam&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译者&…

[JavaWeb玩耍日记]Maven的安装与使用

目录 一.作用 二.安装 三.使用 2.对项目使用compile命令进行编译,看看新的文件会在哪里产生&#xff1f; 3.需要认识的命令 4.Maven对项目执行不同命令的生命周期特点&#xff1f; 5.如何导入工程外的Maven&#xff1f; 6.如何直观地查看Maven导入了哪些工程或哪些jar包…

Stream流学习笔记

Stream流 创建流中间操作1、filter2、map3、distinct4、sorted5、limit6、skip7、flatMap 终结操作1、forEach2、count3、max&min4、collect5、查找与匹配 创建流 单例集合&#xff1a;集合对象.stream() List<Integer> list new ArrayList<>(); Stream<…

前端JavaScript篇之Promise解决了什么问题、Promise.all和Promise.race的区别的使用场景

目录 Promise解决了什么问题Promise.all和Promise.race的区别的使用场景 Promise解决了什么问题 Promise 解决了 JavaScript 中回调地狱的问题。在传统的回调函数中&#xff0c;如果需要依次执行多个异步操作&#xff0c;就需要使用嵌套的回调函数&#xff0c;这样会导致代码难…

如何学习VBA_3.2.14:VBA中字符串的处理和判断函数

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的劳动效率&#xff0c;而且可以提高数据处理的准确度。我推出的VBA系列教程共九套和一部VBA汉英手册&#xff0c;现在已经全部完成&#xff0c;希望大家利用、学习。 如果…

EasyCaptcha,开源图形验证码新标杆!

引言&#xff1a; 随着互联网的普及&#xff0c;验证码已成为网站和应用程序中不可或缺的安全组件。它能够有效地防止自动化攻击、垃圾邮件和机器人活动。在众多验证码解决方案中&#xff0c;Easy-captcha以其简单易用和高度可定制的特点受到了开发者的青睐。本文将指导读者如…