9月17日Python学习前天上课讲到了第二个项目“探究数据在计算机中的表示——认识数据编码”,教材上有一个活动,学生用ASCII码写一段话然后翻译,如果对照ASCII码表来查找的话非常的麻烦,能不能用Python写个小程序呢?经过自己的尝试和群友的提示,做了两个小程序,顺便把Python的基础知识复习了一下,太久不写程序了,忘了太多了。
项目主题:
二进制ASCII码和英文字符转换 项目功能:
1、基本需求:输入一个二进制ASCII码输出对应的英文字符,或输入一个英文字符输出对应的二进制编码。 2、扩展需求:读取文件进行转换后输出到文件。 项目过程:
1、寻找函数
产生这个想法后,我的第一反应是有函数可以用。但是不记得是什么函数了。于是去“菜鸟教程”网上去找,找到了ord()和chr()两个函数。
2、测试函数
使用中发现这两个函数只能在十进制ASCII和英文字符之间转换,不符合需求。
3、寻找十进制二进制转换函数
发现了bin()函数,可以把ord()转换后的十进制数转换为二进制。但是输入的数怎么办呢?因为要输入的是二进制数,所以input()命令要把输入的数字当做二进制数识别。这个是从未想过的输入需求。在网络上一番检索,结果在某个角落里发现了int()函数居然可以带参数,int(s,2)就是将s转为二进制。那么按照这个思路,int(input(),2)是不是就会把输入的二进制字符转为二进制呢?试了一次,果然可以。
4、编写程序
主要难点都解决了,下面就是程序的细节设计了,考虑到重复使用,所以加了循环;考虑到一个程序实现相互转换,所以加了选择;考虑到输入错误,所以加了异常处理。
while True: ch=input('''1为ASCII转英文,2为英文转ASCII码。请输入1或2并按回车:''') go='' if ch=='1': while go!='q': try: s=int(input('请输入一个二进制ASCII码:'),2)#方法1 #s=eval('0b'+input('请输入一个二进制ASCII码:'))#方法2 print(bin(s),'的是十进制数是',s,'的英文字符为:',chr(s)) go=input('按回车继续,输入q按回车返回上一级选择。') except: print('输入错误,请输入一个8位以内的二进制数') elif ch=='2': while go!='q': try: s=input('请输入一个英文字符:') print(s,'的十进制ASCII码为:',ord(s),'二进制ASCII码为:',bin(ord(s))) go=input('按回车继续,输入q按回车返回上一级选择。') except: print('输入错误,请输入一个英文字符') else: print('输入错误,请重新输入1或2。')
后来在刘晶老师的提示下,忽然意识到这个程序很没有意义,在idle的交互模式下,直接使用这几个函数一样可以,根本无需编程。
5、实现文件读取写入
交互模式可以对单个字符和ASCII转换,但是不能对批量的内容转换。实际应用中也是需要批量处理的,所以进一步完善程序。
读文件写文件的方法全忘了,再次到“菜鸟教程”网找。这个没什么难度,很快就写出来了下面的代码。
try: f=open('二进制ASCII码.txt','r') f1=open('英文.txt','w')#参数'a'为追加,'w'为重写 k=''#方法二需要设置累加器初始值 for l in f: s=int(l,2)#方法1 #s=eval('0b'+input('请输入一个二进制ASCII码:'))#方法2 #f1.write(chr(s))#方法一追加写 k=k+chr(s)#方法二累加读取后一次性写 f1.write(k)#方法二一次性写入 f.close() f1.close()#必须关闭,否则不能完成写入 print('转换完毕,请打开"英文.txt"查看')except: print('注意光标必须在最后一行末尾,文末不能有空行,文件中必须是二进制数')
这是将二进制ASCII码转英文字符的程序,有个小要求就是文件中的二进制数要一行一个。一行多个过于复杂了,我还没有去想。
f=open('英文.txt','r')f1=open('二进制ASCII码.txt','w')k=''#方法二需要设置累加器初始值s=f.read()for i in s: k=k+bin(ord(i)).lstrip('0b')+'\n'#lsrtip('0b')作用是去掉转换后二进制数前面的0bf1.write(k)#方法二一次性写入f.close()f1.close()#必须关闭,否则不能完成写入print('转换完毕,请打开"二进制ASCII码.txt"查看')
这是英文字符转二进制的代码,其中第6行花了点心思。 项目收获:
通过完成这个小项目,把python的基础知识又捡了起来。对python的熟悉程度,绝对影响着问题解决的思路。这是不是说计算思维是基于基本知识和技能的掌握程度的?
此外,之所以写这个程序,是想在课堂上让学生感受手工转换和程序转换的差异,并提前将python引入。刘晶老师的交互模式方法可以直接用在人工方法,文件读写的方法可以用在总结展示环节或者分层提高环节。
当然这一切都是基于前面教学设计足够合理的前提下,我这节课上得不满意。思路很局限,不能很好的发挥程序的作用。
在交流中看到刘晶老师的两个活动很值得学习。
这两个两个例子更生活化,学生更容易操作,容易理解,更有意思。尤其是刘老师还提到用姓名的编码作为密码,这个思路太开阔了。