python竞赛试题及答案_Python全国少⼉编程竞赛参赛作品
《⾃主数学练习⼩⼯具》解析...
本⽂介绍的作品是全国青少年创意编程与智能设计⼤赛创意编程⽐赛张佳栩同学的参赛作品。
这篇⽂章我们继续讲解Python语⾔的内容,这次要学习的是张佳栩同学开发的⾃主数学练习⼩⼯具,上⾯的作品说明很简单明要,只提到⽤到了tkinter图形化界⾯,其实这部作品的内容⽐上⼀篇⽂章的难度⾼了⼀个台阶,除了变量、循环、条件选择这些基本的编程知识外,还涉及到了⾃定义函数、tkinter模块的使⽤以及随机数模块。
按照惯例,果冻⽼师还是以代码的顺序由上到下进⾏分析讲解。python web开发工具
tkinter介绍
⼤家都知道当我们编写完Python代码调试程序的时候,通常的界⾯都是这样的:
程序在屏幕上⼀⾏⼀⾏的显⽰⽂字,我们也只能通过键盘输⼊来和程序进⾏交互,这看起来像上个世纪的操作界⾯,太古⽼,太不⼈性化了。那有没有⼀种⽅法使得我们编写的程序像操作电脑上的软件⼀样呢?不仅有⽂字,还有输⼊框、下拉选择框、按钮等等,这样,不但能使⽤键盘,还能使⽤⿏标⽅便的进⾏拖动、点击、选择。
我们说的这种⽅法呀其实叫做图形化操作界⾯,在Python中可以通过⾃带的tkinter模块来实现。通过这个模块我们可以开发⼀个计算器、⼀个写字板、⼀个课程表等等各种各样的⼩程序。
⽐如今天我们学习的数学练习⼩⼯具,它就是这个样⼦的:
⽐起第⼀个界⾯,看上去是不是友好多了!这就是tkinter模块的优势所在。
⽆论是Python程序⾃带的还是第三⽅的模块都需要引⼊,于是第⼀步我们要做的就是引⼊tkinter模块。
引⼊模块
⾸先,在代码的最上⾯,引⼊作品所需要的两个模块,分别是tkinter和random:
有同学⼀开始就疑惑了,不是引⽤两个模块吗,怎么写了四⾏代码?⼜是,⼜是import..as..,⼜是,这么多的写法是⼲什么呢?
我们看到这三种写法都包含有⼀个英⽂单词:import,这个单词中⽂翻译过来就是引进、导⼊的意思,可见这四⾏代码都是引⼊模块的作⽤,可是两个模块为什么要写四个引⽤?
我们仔细看就会发现,前三⾏的引⼊都与tkinter这个模块有关,⽽最后⼀⾏与random模块相关。果冻⽼师从简单的开始,先说说
import random的意思很明⽩,就是把random随机数模块引⼊到我们的项⽬中,random模块中包含有很多的函数、常量,于是引⼊之后我们在后⾯的代码中就可以使⽤这些函数或常量了,⽐如:
这⾏代码通过调⽤random模块中的randint函数创建了⼀个随机数。可是,某些模块的名字很长,或者说在代码中我们会⾮常频繁的⽤到某个模块,于是,我们就可以通过as关键字给引⼊的模块添加⼀个别名:import tkinter as tk。这样,在调⽤函数的时候就可以使⽤简写的名字了。
就如同⽗母给每个孩⼦起⼀个⼩名⼀样,不但好记也好叫。同样的代码中使⽤别名也可以简化代码的书写,也更⽅便阅读。
前⾯的这两种import写法引⼊的都是整个模块,假如我们⽤不到某个模块的所有函数,只需要引⼊⼀个指定的函数,那就要⽤到最后⼀种写法:from tkinter import messagebox,它的意思是从tkinter模块中引⼊messagebox这个类,这样我们就可以像使⽤当前项⽬的函数⼀样来使⽤模块中的函数了。
要注意的是,引⼊模块的代码必须要写在项⽬的最上⾯,否则调试的时候就会报错了哦。
变量初始化与定义函数
引⼊模块的后⾯紧接着是变量初始化的语句。
这⾥我们初始化了⼀个名叫“realanswer”的全局变量,那什么是全局变量呢?与全局变量对应的还有⼀个局部变量。全局变量指的是在函数外部定义的变量,我们可以在整个程序中或者所有的函数⾥使⽤它。⽽局部变量是定义在函数内部的变量,我们只可以在定义这个变量的函数内使⽤它。要注意的是,如果要在函数内读取⼀个全局变量的值,我们可以直接使⽤它,⽐如:
但是,如果要在函数内部修改⼀个全局变量的值,必须要使⽤global关键字:
否则,程序就会报错了。
realanswer这个全局变量的作⽤是保存各种数学运算的正确答案,后⾯我们会将⽤户输⼊的答案与realanswer变量的值进⾏⽐较,来判断⽤户是否答对了。
初始化好变量之后,就要进⾏函数定义了。
问题⼜来了,那什么是函数呢?为什么要使⽤函数?这个还真不好回答,果冻⽼师就以⼀个同学们⽣活的例⼦来说明吧,⽐如说要开发⼀个⽣活管理的⼩软件,按照⼀天的流程应该是:起床、刷⽛、洗脸、吃早饭、上学、放学、吃午饭、上学、放学、吃晚饭、写作业、刷⽛、洗脸、睡觉。要把这⼀天的流程写成代码,就是按照顺序写起床的代码、刷⽛的代码、洗脸的代码......最后到洗脸的代码、睡觉
的代码。
可是同学,你们发现了吗,这⼀系列的流程中有好⼏个都是重复的,⽐如刷⽛、洗脸重复了两次,上学、放学也重复了两次,⽽吃饭⼀天内要重复做三次,这样⼦我们写的代码中就会有很多重复性的代码,同⼀个功能的代码逻辑会出现在不同的地⽅,假如后⾯要修改吃饭的逻辑,那就必须同时修改三个地⽅,这很容易就造成改了这个忘了那个的问题。
那有没有⼀种⽅法让我们解决这种bug呢?这就是函数的作⽤了。函数就是将程序中相同的逻辑提炼出来,形成可以重复使⽤的代码块。函数以def关键⼦为开头,后⾯跟着函数的名称和圆括号( ),⽐如:
吃菜、吃⽶饭这些就是函数的具体逻辑。接下来,我们只需要在程序中早、中、晚的地⽅调⽤吃饭( )函数就可以了,这样⼤⼤的简化了代码的书写量。
spring boot注解在控制器没效果使⽤函数另⼀个好处就在于修改的⽅便,⽐如说我们要将早、中、晚吃饭中的吃⽶饭改为吃⾯条,那么只需要把函数⾥的代码修改⼀次,调⽤的三个地⽅就会⾃动的更改过来。
这样的代码是不是就智能多了!
⽽且,果冻⽼师建议不但重复的逻辑要写成函数,像起床、睡觉这些只出现⼀次的逻辑也把它们写成函数,假设我们要给⼀天的流程中再增加⼀个睡午觉的节点,那么我们只需要在中午的时候再调⽤⼀
下睡觉和起床的函数就OK了,很⽅便!
java中的线程池好了,搞懂了函数的作⽤之后,我们回到数学练习⼩⼯具的代码中。
在这个⼯具的界⾯中⼀共有四种数学运算的类型,分别是四则运算、⼀元⼀次⽅程、平⽅/开⽅和⼀次函数运算:
于是,我们就可以把这四种运算⽅式定义成四个函数。
省略号呢就代表的是函数中具体的逻辑代码了。由于篇幅的原因,这些函数果冻⽼师就不⼀⼀讲解了,挑⼀个四则运算来看⼀看吧。
按照上⾯所讲的,⾸先将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的判断,直到判断成⽴为⽌。
果冻⽼师要交给你⼀个课后任务了,在你学完这个作品后,试着去掉结果只能是整数的这个限制,让⼩数答案的试题也可以进⾏练习。
四则运算函数的代码就是这样⼦,⼀元⼀次⽅程、平⽅开⽅、⼀次函数这三个函数的代码也交给你⾃⼰学习吧,如果在学校的数学课中学习过这⼏种运算⽅式,相信你看懂它们的代码不是问题。
四种运算的函数我们都定义好了,可是代码怎么知道⽤户在屏幕上选择的是哪⼀种运算⽅式呢?这就需要再定义⼀个函数:
css基础选择器包括?place( )函数就是⽤来判断题⽬类型的。函数中⾸先获取了⽤户输⼊的最⼩值和最⼤值,以及从下拉框中选择的运算⽅式。然后判断maxi和mini变量,如果它们其中有⼀个的值为"none",则提⽰⽤户必须输⼊数值。然后,通过for循环语⾔清空realshow列表的所有内容,这⾥张佳栩同学⽤了⼀种取巧的⽅式来清空列表,它给列表插⼊了15⾏空内容,把之前显⽰的⽂字挤到外⾯去,其实显⽰的内容还是存
在于列表中的,⽽真正清空列表的写法是这样⼦:
函数最后⼏⾏通过if..lse条件语句判断⽤户选择的运算⽅式是哪⼀种,并调⽤相应的运算函数,这样就将屏幕上⽤户的选择与程序中的计算函数对应起来了。
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,则默认选中第⼆项。
少儿python入门教程按钮通过Button( )函数创建:
Button( )函数中有⼀个command属性,它设置的就是点击按钮后所执⾏的函数,于是⽣成题⽬按钮的command属性就设置为place,提交答案按钮的command属性就设置为sumbit,注意这⾥函数名称不需要添加括号。
在程序的最最后设置上mainloop( )函数,只有设置了这条语句窗⼝和所有的控件才能显⽰在屏幕上:
这时,我们的数学练习⼩⼯具就可以跑起来啦!
总结
setpreferredsize在这篇⽂章中,张佳栩同学使⽤Python语⾔开发了⼀款练习数学的⼩程序,它实际上就是⼀个⾃动的出题的⼯具,有了它相信对于提⾼你的数学课成绩会有很⼤的帮助哦,不仅仅是因为有⽆数的练习题可以做,⽽且开发软件的过程也是对各种运算逻辑熟悉与验证的过程。看到这个作品后,有没有对你有⼀些启发呢?也许你想到了开发⼀款语⽂练习的⼩程序或者英语练习的⼩程序,它们可以帮助其它同学复习巩固语⽂和英语课的知识,如果你已经有了⼀些的想法的话,那就快去尝试吧!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。