APP下载

树莓派“图解”高中Python会考题二例

2022-07-28牟晓东

电脑报 2022年28期
关键词:二进制树莓图解

牟晓东

高中信息技术会考对Python语言的基本语法应用及程序代码的补充解析提出了一定要求,除了通过选择题对变量名命名规则、表达式运算结果的求解等基本知识点进行考查外,还有通过阅读程序段来写出运行结果的方式,或是根据题意进行程序代码的补充填写的方式。在Python的学习备考过程中,如果能够结合树莓派开源硬件编程,将程序的运行结果进行“图解”——以一种更为直观的方式来“看”程序,无疑会极大提高学生学习编程的兴趣。在此以“‘只有一人说谎’的抓小偷”逻辑判断和简易“十进制转二进制”两道Python会考题为例:

有四个嫌疑人甲乙丙丁涉嫌偷盗,可以肯定的是其中一人就是小偷。在警察审讯过程中,甲说:“不是我!”乙说:“是丙干的!”丙说:“是丁干的!”丁说:“丙在冤枉我!”如果他们四人当中只有一人说了假话,请编程判断谁是小偷。

在进行Python代码运行的单纯文字结果输出基础上,将树莓派安装上四支不同颜色的LED灯分别代表甲乙丙丁四个嫌疑人进行“图解”,最终实现程序精准控制某LED灯亮起,对应此嫌疑人为真正的小偷。

首先,将古德微扩展板正确安装于树莓派上;接着,将红色、绿色、黄色和蓝色四支LED灯均按照“长腿正、短腿负”的原则,分别插接至扩展板的5号、6号、12号和16号插孔(对应甲乙丙丁四个嫌疑人);最后,插接上电源线为树莓派供电启动系统(如图1)。

通过Windows的“远程桌面连接”输入树莓派的IP地址,进入后点击“编程”—“ThonnyPythonIDE”菜单开始代码编程。

首先,通过“from gpiozero import LEDBoard”语句,实现从GPIOZero库中导入LEDBoard类;接着,使用“LEDs = LEDBoard(5,6,12,16)”语句来组建四支LED灯的“灯阵”,其中的参数“5,6,12,16”即对应各LED灯所插入树莓派的引脚号;然后,建立嫌疑人变量列表:“persons = [‘甲’,‘乙’,‘丙’,‘丁’]”,注意其中数据的次序是与红色、绿色、黄色和蓝色LED燈一一严格对应的;再建立一个for循环结构对persons列表所存储的四个数据进行“遍历”,变量flag的值为一个逻辑值的运算表达式:“flag = (thief!=‘甲’) + (thief==‘丙’) + (thief==‘丁’) + (thief!=‘丁’)”——Python运算时会将逻辑真(True)的值设为1、将逻辑假(False)的值设为0,该行代码是根据题意分别将甲乙丙丁四个嫌疑人的“口供”进行了Python化“转译”;如果四个逻辑值相加的结果是3的话(三个人说的是真话),则先打印输出真正的小偷:“print(‘嫌疑犯是:’,thief)”,再将该嫌疑人所对应的LED灯“点亮”:“LEDs.on(persons.index(thief))”,其中的“index(thief)”是作为变量persons列表数据引用索引序号(如图2)。

将程序代码保存为Catch_Thief.py文件,点击“Run”按钮运行程序进行检测,下方的程序输出结果显示为:“嫌疑犯是:丙”,同时树莓派上的第三支黄色LED灯也会亮起(如图3)。此时,程序中的变量flag的值为3(if条件成立),变量thief的值是“丙”,而“persons.index(thief)”的值为索引号2,它作为LEDs.on的参数时就会对应亮起树莓派12号引脚上的第三支黄色LED灯。

对于会考中经常涉及的较小数字进制转换问题,比如16以内的十进制数(相当于一个十六进制位)转二进制数,完全不必使用“除以2倒序余”法,可以直接尝试“8421”分解组合求和法,使用不同位的“权数”进行两种进制间的快速任意相互转换。比如:给出一个十进制数6,通过“8421”直接分解为“4+2”,对应写出二进制结果是“110”;如果是十进制数9,则分解为“8+1”,对应的二进制数就是“1001”。如果待转换的十进制数大于15,则在“8421”的基础上依次向左扩充一位“16”,再不够就再扩充第二位“32”……

保持上一道题的树莓派及四支LED灯等实验器材和连接方式不变,设定“8421”的对应数位分别是从高位到低位的红色、绿色、黄色和蓝色LED灯,相当于四个二进制位,最大可“图解”表示的十进制数为15(对应十六进制的F)。对于程序将用户从键盘上接收到的十进制数,转换为四位的二进制数后,将对应数位是1的LED灯“点亮”,而数位为0的则保持熄灭状态。

在PythonIDE中仍然先使用“from gpiozero import LEDBoard”语句,从GPIOZero库中导入LEDBoard类,同样是再组建LED“灯阵”:“LEDs = LEDBoard(5,6,12,16)”;接着,通过input()和int()函数为变量My_Decimal赋值,实现接收用户从键盘上输入的任意一个16以内的十进制整数:“My_Decimal = int(input(“请输入一个16以内的十进制整数:”))”;语句“My_Binary = format(My_Decimal,‘b’)”的作用是为变量My_Binary赋值,该值是通过format将变量My_Decimal的值转换为对应的二进制“数”——特别要注意这是一个字符串类型的数据;考虑到用户输入的十进制数如果是“大于等于0且小于等于7”时,转换出的二进制字符串数据是不足四位的(1位、2位或3位),此时无法与树莓派的四支LED灯阵一一对应,因此必须要对二进制字符串数据进行高位“补零”操作——建立变量My_Binary_4,为其赋值为“My_Binary.rjust(4,‘0’)”,即通过rjust右对齐来实现四位数据的构建。

接下来,建立一个for循环,通过range(4)实现从第1至第3的四次循环,依次判断变量My_Binary_4中所存储的四位字符串型二进制数是否有1:“if My_Binary_4[i]==‘1’:”;条件成立的话,则控制对应编号的LED灯发光:“LEDs.on(i)”;最后,将用户输入的十进制整数和转换后的二进制数通过print进行输出:“print(‘十进制整数’,My_Decimal,‘转换为二进制数是:’,My_Binary)”(如图4)。

将程序保存为Decimal2Binary.py文件,点击“Run”按鈕运行进行两次测试:第一次在“请输入一个16以内的十进制整数:”提示后输入6,回车后发现树莓派上的中间绿色和黄色LED亮起,同时程序下方也有“十进制整数6转换为二进制数是:110”的提示输出;第二次测试数字9,回车后会亮起两侧的红色和蓝色LED灯,同时提示信息会显示为“十进制整数9转换为二进制数是:1001”(如图5),实现了简易“十进制转二进制”的图解过程。

程序本身只是简单地实现了将一个0至15的十进制整数转换为二进制数输出及对应的LED灯发光或是熄灭的图解功能,既没有对用户从键盘上输入的数据进行一定的“容错”判断处理(比如输入了小数或是超过15的整数),也没有加入循环控制用户的多次测试(程序运行一次只能测试一个数据),均可以考虑进行程序的进一步完善。同时,也可以尝试另一种相似的图解方式,比如使用for循环(range(16)),依次将0~15这十六个十进制整数均转换为对应的二进制数,每隔一段时间(比如3秒钟)就输出一组数据,同时也会控制树莓派上的LED“灯阵”进行对应的亮灯、关灯显示,实现四个二进制数位从“全灭”(0000)到“全亮”(1111)进制数据转换的动态演示,大家不妨一试。

猜你喜欢

二进制树莓图解
用二进制解一道高中数学联赛数论题
有趣的进度
二进制在竞赛题中的应用
基于树莓派的骑行智能头盔设计
基于树莓派的远程家居控制系统的设计
图解十八届六中全会
响应面法优化红树莓酒发酵工艺
图解天下
欧盟:速冻树莓比鲜食树莓市场更好
一个生成组合的新算法