和小家伙一起学编程 004 编码

96
closer2sky 22d8d123 271c 4d80 9c59 6990844a9e37
2.0 2019.01.30 19:06* 字数 1090

编码,简单的说,就是将信息从一种表达方式转换成另一种表达方式。

例如,和小朋友约定,如果连续敲三下然后停一下,就表示是爸爸妈妈在敲门。

例如,当有重要而不希望其他人知晓的信息需要传递时,我们可以把信息加密;而当要节约传递和储存所需的资源时,我们会把信息压缩……

想像一下,不论是视频、图片、声音,还是文本、数字,任何我们用计算机处理的东西,最后都被编码成为只有0和1两种状态的比特(bit),它们在计算机、互联网、手机以及各种数字化硬件中千变万化,川流不息……

当然,我们编程,也可以说是编码,把我们头脑中解决问题的方式表达为某种计算机语言,这样,计算机就可以帮我们解决问题了。

Scratch 简单的十进制转二进制演示

这个Scratch程序要比之前的长许多,不过别担心,我们并没有用一般的算法(需要除法、余数)来进行十进制转换二进制,而是主要依靠加减法和进位、借位,其实这只是一个同时显示十进制和二进制的计数器。

首先按图设置变量,勾选变量让它们显示在游戏区域上,双击游戏区域的变量,可以显示为图中的样式。

再画两个角色作为加、减的按钮,画面上部加减按钮之间的2个变量分别是十进制数的十位、个位。

下面一排5个变量各表示二进制数的一位,从左到右依次是:5bit(16)、4bit(8)、3bit(4)、2bit(2)、1bit(0)。

十进制数的每一位,分别表示有多少个、多少十(10)、多少一百(10 x 10)、多少一千(10 x 10 x 10),以此类推,小朋友们已经学过。

同理,二进制数的每一位,分别表示有多少个、多少2(2)、多少4(2 x 2)、多少8(2 x 2 x 2)、多少16(2 x 2 x 2 x 2)……这也就是上面表示二进制数的5位的变量名的意义。

设置变量,以及减1按钮的代码
加1按钮的代码
小机器人的代码1

小机器人的代码2

理解这里的关键就是二进制加法:

0 + 0 = 0
0 + 1 = 1
1 + 1 = 0 并进位1

减法类似。

小机器人的代码3
小机器人的代码4
小机器人的代码5
小机器人的代码6

点击加1、减1按钮,就可以看到对应的十进制和二进制数了。

在Python中,整数可以用不同的进制表示,之间可以自动转换,编辑number.py并运行:

dec = int(input("输入十进制数:")) 
print("十进制数:", dec)
print("转换为二进制:", bin(dec))
print("转换为八进制:", oct(dec))
print("转换为十六进制:", hex(dec))

不仅数字要编码,计算机中的文字也需要编码,最基本常用的是ASCII码,但它只能表示英文字母和其他有限的字符而无法表示中文等字符,常见的中文编码方案有GB2312、GBK等等,而在网页中我们往往会使用UTF-8编码……

在Python中可以用用chr()、ord()两个函数来查看和转换字符的ASCII编码:

>>> chr(66)
'B'
>>> chr(40)
'('
>>> ord('b')
98
>>> ord('B')
66

Python 简单的加密解密

encode.py:

raw = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
key = "BUAKOMIZTGFELXVWRYSJNCQDHP"

source = input("输入要加密的句子:").upper()
encoded = ""
for c in source:
    if c in raw:
        encoded += key[raw.find(c)]
    else:
        encoded += c
print("加密后的句子:")
print(encoded)

运行:

输入要加密的句子:I love Python!
加密后的句子:
T EVCO WHJZVX!

key就是所谓的密钥,先把输入的句子都转换为大写字母,然后把每个字母依次替换成密钥中对应的字母,其他字符保持原样。

Python中可以用[]来取得字符串中的某一部分,而find()函数可以取得字符在字符串中的位置或者索引值,如果没找到会返回-1:

>>> s = "This is a string."
>>> s[0]
'T'
>>> s[-1]
'.'
>>> len(s)
17
>>> s[16]
'.'
>>> s[5:8]
'is '
>>> s.find('a')
8
>>> s.find('k')
-1

而解码就是把编码反过来。

decode.py:

raw = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
key = "BUAKOMIZTGFELXVWRYSJNCQDHP"

encoded = input("输入要解密的句子:")
source = ""
for c in encoded:
    if c in key:
        source += raw[key.find(c)]
    else:
        source += c
print("解密后的句子:")
print(source)

运行:

输入要解密的句子:T EVCO WHJZVX!
解密后的句子:
I LOVE PYTHON!

节点目录

和小家伙一起学编程 000 出发

和小家伙一起学编程 001 条件

和小家伙一起学编程 002 循环

和小家伙一起学编程 003 随机

和小家伙一起学编程 004 编码

和小家伙一起学编程 005 对象

和小家伙一起学编程 006 函数

和小家伙一起学编程 007 算法

和小家伙一起学编程
Web note ad 1