1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > python竞赛试题及答案_Python全国少儿编程竞赛参赛作品《自主数学练习小工具》解析...

python竞赛试题及答案_Python全国少儿编程竞赛参赛作品《自主数学练习小工具》解析...

时间:2023-03-31 09:21:45

相关推荐

python竞赛试题及答案_Python全国少儿编程竞赛参赛作品《自主数学练习小工具》解析...

本文介绍的作品是全国青少年创意编程与智能设计大赛创意编程比赛张佳栩同学的参赛作品。

这篇文章我们继续讲解Python语言的内容,这次要学习的是张佳栩同学开发的自主数学练习小工具,上面的作品说明很简单明要,只提到用到了tkinter图形化界面,其实这部作品的内容比上一篇文章的难度高了一个台阶,除了变量、循环、条件选择这些基本的编程知识外,还涉及到了自定义函数、tkinter模块的使用以及随机数模块。

按照惯例,果冻老师还是以代码的顺序由上到下进行分析讲解。

tkinter介绍

大家都知道当我们编写完Python代码调试程序的时候,通常的界面都是这样的:

程序在屏幕上一行一行的显示文字,我们也只能通过键盘输入来和程序进行交互,这看起来像上个世纪的操作界面,太古老,太不人性化了。那有没有一种方法使得我们编写的程序像操作电脑上的软件一样呢?不仅有文字,还有输入框、下拉选择框、按钮等等,这样,不但能使用键盘,还能使用鼠标方便的进行拖动、点击、选择。

我们说的这种方法呀其实叫做图形化操作界面,在Python中可以通过自带的tkinter模块来实现。通过这个模块我们可以开发一个计算器、一个写字板、一个课程表等等各种各样的小程序。

比如今天我们学习的数学练习小工具,它就是这个样子的:

比起第一个界面,看上去是不是友好多了!这就是tkinter模块的优势所在。

无论是Python程序自带的还是第三方的模块都需要引入,于是第一步我们要做的就是引入tkinter模块。

引入模块

首先,在代码的最上面,引入作品所需要的两个模块,分别是tkinter和random:

有同学一开始就疑惑了,不是引用两个模块吗,怎么写了四行代码?又是import...,又是import..as..,又是from...import...,这么多的写法是干什么呢?

我们看到这三种写法都包含有一个英文单词:import,这个单词中文翻译过来就是引进、导入的意思,可见这四行代码都是引入模块的作用,可是两个模块为什么要写四个引用?

我们仔细看就会发现,前三行的引入都与tkinter这个模块有关,而最后一行与random模块相关。果冻老师从简单的开始,先说说import...

import random的意思很明白,就是把random随机数模块引入到我们的项目中,random模块中包含有很多的函数、常量,于是引入之后我们在后面的代码中就可以使用这些函数或常量了,比如:

这行代码通过调用random模块中的randint函数创建了一个随机数。可是,某些模块的名字很长,或者说在代码中我们会非常频繁的用到某个模块,于是,我们就可以通过as关键字给引入的模块添加一个别名:import tkinter as tk。这样,在调用函数的时候就可以使用简写的名字了。

就如同父母给每个孩子起一个小名一样,不但好记也好叫。同样的代码中使用别名也可以简化代码的书写,也更方便阅读。

前面的这两种import写法引入的都是整个模块,假如我们用不到某个模块的所有函数,只需要引入一个指定的函数,那就要用到最后一种写法:from tkinter import messagebox,它的意思是从tkinter模块中引入messagebox这个类,这样我们就可以像使用当前项目的函数一样来使用模块中的函数了。

要注意的是,引入模块的代码必须要写在项目的最上面,否则调试的时候就会报错了哦。

变量初始化与定义函数

引入模块的后面紧接着是变量初始化的语句。

这里我们初始化了一个名叫“realanswer”的全局变量,那什么是全局变量呢?与全局变量对应的还有一个局部变量。全局变量指的是在函数外部定义的变量,我们可以在整个程序中或者所有的函数里使用它。而局部变量是定义在函数内部的变量,我们只可以在定义这个变量的函数内使用它。要注意的是,如果要在函数内读取一个全局变量的值,我们可以直接使用它,比如:

但是,如果要在函数内部修改一个全局变量的值,必须要使用global关键字:

否则,程序就会报错了。

realanswer这个全局变量的作用是保存各种数学运算的正确答案,后面我们会将用户输入的答案与realanswer变量的值进行比较,来判断用户是否答对了。

初始化好变量之后,就要进行函数定义了。

问题又来了,那什么是函数呢?为什么要使用函数?这个还真不好回答,果冻老师就以一个同学们生活的例子来说明吧,比如说要开发一个生活管理的小软件,按照一天的流程应该是:起床、刷牙、洗脸、吃早饭、上学、放学、吃午饭、上学、放学、吃晚饭、写作业、刷牙、洗脸、睡觉。要把这一天的流程写成代码,就是按照顺序写起床的代码、刷牙的代码、洗脸的代码......最后到洗脸的代码、睡觉的代码。

可是同学,你们发现了吗,这一系列的流程中有好几个都是重复的,比如刷牙、洗脸重复了两次,上学、放学也重复了两次,而吃饭一天内要重复做三次,这样子我们写的代码中就会有很多重复性的代码,同一个功能的代码逻辑会出现在不同的地方,假如后面要修改吃饭的逻辑,那就必须同时修改三个地方,这很容易就造成改了这个忘了那个的问题。

那有没有一种方法让我们解决这种bug呢?这就是函数的作用了。函数就是将程序中相同的逻辑提炼出来,形成可以重复使用的代码块。函数以def关键子为开头,后面跟着函数的名称和圆括号( ),比如:

吃菜、吃米饭这些就是函数的具体逻辑。接下来,我们只需要在程序中早、中、晚的地方调用吃饭( )函数就可以了,这样大大的简化了代码的书写量。

使用函数另一个好处就在于修改的方便,比如说我们要将早、中、晚吃饭中的吃米饭改为吃面条,那么只需要把函数里的代码修改一次,调用的三个地方就会自动的更改过来。

这样的代码是不是就智能多了!

而且,果冻老师建议不但重复的逻辑要写成函数,像起床、睡觉这些只出现一次的逻辑也把它们写成函数,假设我们要给一天的流程中再增加一个睡午觉的节点,那么我们只需要在中午的时候再调用一下睡觉和起床的函数就OK了,很方便!

好了,搞懂了函数的作用之后,我们回到数学练习小工具的代码中。

在这个工具的界面中一共有四种数学运算的类型,分别是四则运算、一元一次方程、平方/开方和一次函数运算:

于是,我们就可以把这四种运算方式定义成四个函数。

省略号呢就代表的是函数中具体的逻辑代码了。由于篇幅的原因,这些函数果冻老师就不一一讲解了,挑一个四则运算来看一看吧。

按照上面所讲的,首先将realanser声明为全局变量,因为我们要在函数中给它赋值。接着定义mini和maxi两个局部变量,分别存储用户通过软件界面输入的最小值和最大值,并且通过int( )函数将这两个变量转换为整型。

然后,再定义x、y两个变量,random.randint( )函数会生成两个随机数并保存在这两个变量中,函数的括号中需要传入mini最小值和maxi最大值两个参数,这样生成的随机数就不会超出参数所表示的范围。

变量typeo,它保存的是1到4之前的一个随机数字,四则运算有加、减、乘、除四种运算方式,所以变量typeo就用数字1-4表示这四种运算,它们会随机的出现。

当typeo的值等于1时,代表是加法运算,这里又出现了code、show1、realshow这三个变量,其实show1、realshow这两个变量代表的是tkinter模块中的两个控件,在界面上对应显示是这样的:

界面中的每一个控件都有一个名字,它们对应代码中的一个变量,那这种关系是如何建立起来的呢?果冻老师会在后面的内容中介绍。我们只需要知道show1、realshow变量表示的是两个列表控件,给列表控件添加数据,需要使用insert( )函数,函数的第一个参数是添加的位置,第二个参数是添加的数据,要注意的是列表的位置是从0开始的,这样通过设置就将“题目为(加法)”这段文字减价在show1这个列表控件中,将x + y所对应的字符串添加在realshow这个列表控件中。

最后将x+y运算所得的值保存在代码一开始定义的realanswer这个变量中,加法运算的代码逻辑就完成了。

减法和乘法运算的代码和加法是一样的,相信你一看就会了。

接下来说一下除法,张佳栩同学开发的这个数学练习小工具有一个小限制,就是使用者输入的答案必须是整数,不能是小数,所以在做除法运算时,结果是小数的我们都必须过滤掉。

可以看到,在除法运算的开始加入了一个while循环,在上一篇文章中我们学过while True循环是一个无限循环,如果没有手动添加break代码停止,循环会一直执行下去。那循环里面做了什么呢?通过if x % y == 0这个语句来判断x除以y的余数是否等于0,如果等于0,表示x除以y的结果是一个整数,那么就执行break停止while循环,继续运行循环后面的代码,否则x除以y的结果就是小数,那么就重新生成x与y变量的值,然后继续循环执行是否相除等于0的判断,直到判断成立为止。

果冻老师要交给你一个课后任务了,在你学完这个作品后,试着去掉结果只能是整数的这个限制,让小数答案的试题也可以进行练习。

四则运算函数的代码就是这样子,一元一次方程、平方开方、一次函数这三个函数的代码也交给你自己学习吧,如果在学校的数学课中学习过这几种运算方式,相信你看懂它们的代码不是问题。

四种运算的函数我们都定义好了,可是代码怎么知道用户在屏幕上选择的是哪一种运算方式呢?这就需要再定义一个函数:

place( )函数就是用来判断题目类型的。函数中首先获取了用户输入的最小值和最大值,以及从下拉框中选择的运算方式。然后判断maxi和mini变量,如果它们其中有一个的值为"none",则提示用户必须输入数值。然后,通过for循环语言清空realshow列表的所有内容,这里张佳栩同学用了一种取巧的方式来清空列表,它给列表插入了15行空内容,把之前显示的文字挤到外面去,其实显示的内容还是存在于列表中的,而真正清空列表的写法是这样子:

函数最后几行通过if..elif..else条件语句判断用户选择的运算方式是哪一种,并调用相应的运算函数,这样就将屏幕上用户的选择与程序中的计算函数对应起来了。

place( )函数写好之后,我们还需要再定义一个函数,用来判断用户输入的答案是否正确。

逻辑很简单,就是判断用户输入的答案与正确答案是否相同,如果相同就提示答对了,否则提示用户答错了,请重新输入答案。

以上,我们一共定义了六个函数。其中的四个数学运算函数在place( )函数中都被调用了。那place( )函数和sumbit( )在哪里调用呢?这就是文章接下来所涉及的内容。

代码写到这里,如果我们保存并调试程序的话,会发现什么结果都没有,那个可以使用鼠标操作的软件界面在哪里呢?其实,那个界面也是通过代码生成的。

第一行,实例化tkinter对象,实例化是Python这类面向对象语言最重要的概念之一,也是使用tkinter模块必不可少的操作,实例化之后,我们才能调用tkinter中的各种生成控件的函数。

第二行,通过title( )函数设置软件窗口的名称。

下面的三行代码通过三个Label( )函数创建了三个文字标签控件,并且通过text属性设置了标签的文字。这三个标签该如何放到合适的位置上呢?如下图所示,我们可以将软件的界面看成一个七行三列的表格:

于是,布局的问题就变得简单了,比如,“输入最大值”这个文字标签只需要放到表格第一行第一列(column=0, row=0)的位置上就可以了,要注意的是行列的计算也是从0开始的,“输入最小值”的文字标签放在第一行第二列(column=1, row=0)的位置上,“选择题目类型”的文字标签放在第一行第三列(column=2, row=0)的位置上。在代码中,使用grid( )函数加上行列的参数值来定位各种控件的位置。

接着,创建文字标签底下的输入框:

StringVar是tkinter模块特有的对象类型,当我们给这种类型的变量设置值后,新的值会自动同步显示在界面上。当然,给StringVar类型的变量设置值不是用等号,而是用set( )函数,取值则用的是get( )函数,代码中将maxn变量的值默认设置为“none”。然后,通过Entry( )函数创建了一个输入框,并设置宽度属性为16,显示文字属性为maxn变量,这样“none”就默认出现在输入框中了。最后再通过grid( )函数将输入框定位在第二行第一列的位置上。

上面就是最大值输入框的设置过程,同理,最小值输入框、答案输入框、运算方式下拉框和列表控件的创建方式都是类似的,果冻老师就不一一讲解了,但也有几点不同的地方我要强调一下。

下拉框通过Combobox( )函数创建:

在Combobox( )函数中设置state属性为readonly,表示下拉框的选项是只读的,一般情况下都要添加这条设置,否则,我们就能够编辑下拉框中的内容,这样程序运行到place( )函数中就有可能报错了。

下拉框的选项通过一个元组设置,这就表示这些选项是不能改变的,如果需要动态的添加下拉框选项可以使用列表。

最后一行numberChosen.current(0)表示下拉框的默认选中第一项,如果将0改为1,则默认选中第二项。

按钮通过Button( )函数创建:

Button( )函数中有一个command属性,它设置的就是点击按钮后所执行的函数,于是生成题目按钮的command属性就设置为place,提交答案按钮的command属性就设置为sumbit,注意这里函数名称不需要添加括号。

在程序的最最后设置上mainloop( )函数,只有设置了这条语句窗口和所有的控件才能显示在屏幕上:

这时,我们的数学练习小工具就可以跑起来啦!

总结

在这篇文章中,张佳栩同学使用Python语言开发了一款练习数学的小程序,它实际上就是一个自动的出题的工具,有了它相信对于提高你的数学课成绩会有很大的帮助哦,不仅仅是因为有无数的练习题可以做,而且开发软件的过程也是对各种运算逻辑熟悉与验证的过程。看到这个作品后,有没有对你有一些启发呢?也许你想到了开发一款语文练习的小程序或者英语练习的小程序,它们可以帮助其它同学复习巩固语文和英语课的知识,如果你已经有了一些的想法的话,那就快去尝试吧!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。