Python基础之进制及编码
了解计算机中必备的常识知识及常见名词背后的含义。
概要:
- python代码的运行方式
- 进制
- 计算机中的单位
- 编码
1. Python代码的运行方式
- 脚本式
python3 - /PycharmProjects/day03/6.作业题讲解.py
- 交互式
python
2. 进制
- 二级制
#逢二进一
二进制:十进制
0:0
1:1
10:2
11:3
100:4
101:5
110:6
111:
1000:
- 六进制
- 十进制
- 八进制
- 十六进制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a6nP8YiG-1669560611782)(E:\Python\笔记\assets\image-20221127112042383.png)]
2.1 进制转换
- 在Python 中10进制以整型数据的形式存在
- 2、8、16进制以字符串的形式存在
- 2进制与8进制不能直接转换
十进制转换为二进制、
v = bin(23)
print(v)
#0b10
十进制转换为8进制
v1 = oct(36)
print(v1)
#0o44
十进制转换为16进制
v2 = hex(100)
print(v2)
#0x64
#二进制转换为十进制
d1 = int("0b10",base = 2)
print(d1)
#2
#八进制转换为十进制
d2 = int("0o44",base = 8)
print(d2)
# 36
#16进制转换为10进制
d3 = int("0x64",base = 16)
print(d3)
#100
3. 计算机中的单位
由于计算机中本质上所有的东西以为二进制存储和操作的,为了方便对于二进制值大小的表示,所以就搞了一些单位。
- b(bit),位
1 ,1位
13,2位
147,3位
....
- B (Byte),字节
8位是一个字节。
1100 1011 ,一个字节
1010 1000 1100 1001 ,两个字节
- K (kilobyte),千字节
1024B=1K
1K = 1024B*8b
- M (megabyte) ,兆字节
1024KB=1M
1M=1024K=1024*1024B=1024*1024*8bit
- G (Gigabyte),吉字节/千兆
1024M=1G
- T( Trillionbyte)万亿字节/太字节
1TB=1024GB
- 其他还有:
- 1PB( Petabyte,千万亿字节,拍字节)=1024TB
- 1EB( Exabyte,百亿亿字节,艾字节)=1024PB
- 1ZB(Zettabyte,十万亿亿字节,泽字节)=1024EB
- 1YB( Yottabyte,一亿亿亿字节,尧字节)=1024ZB
- 1BB( Brontobyte,千亿亿亿字节)=1024YB
练习
#假设1个汉字需要2个字节(2B=16位来表示,如:1000101011001100),那么1G流量可以通过网络传输多少汉字呢?(计算机传输本质上也是二进制)
1G = 1024M=1024*1024k=1024*1024*1024B=1073741824B
即536870912个汉字
#假设1个汉字需要2个字节(2B=16位来表示,如:1000101011001100),那么500G硬盘可以存储多少个汉字?
536870912*500=268435456000
4. 编码
编码,文字和二进制之间的一个对照表。
4.1 ASCII编码
ASCII规定使用一个字节来表示字母与二进制的对应关系。
00000000
00000001
00000010
........
11111111
2**8=256
- ASCII表
官方网址:https://www.ASCIItable.com/
4.2 gb-2312编码
- gb-2312编码,由国家信息标准委员会制作(1980年)。
- gbk编码,对gb2312进行扩展,包含了中日韩等文字(1995年)。
与二进制的对应关系中具有如下逻辑
- 单字节表示,用一个字节表示对应关系。英文2**8=256。
- 双字节表示,用两个字节表示对应关系。中文汉字2**16=65536。
4.3 Unicode
Unicode也被称为万国码,为全球的每个文字都分配了一个码位(二进制表示)。
- Ucs2
用固定的两个字节来表示一个字符
00000000 00000000
2**16= 65535
- Ucs4
用固定的四个字节来表示一个字符
2**32= 4294967296
参考网址:https://home. Unicode.org/
https:// Unicode-table.com/en/blocks/
-
无论是Ucs2和ucs4都有缺点:浪费空间
文字 十六进制 二进制 A 0041 01000001 :ASCII A 0041 0o0000o0 01000001 :Ucs2 A 0041 0o000000000o000o 00000000 o1000001 :Ucs4 #所以在文件存储或者网络传输时一般不会直接使用 Unicode。 #而在内存中会使用 Unicode。
4.4 UTF-8
包含所有文字和二进制的对应关系,全球应用最为广泛的一种编码(站在巨人的肩膀上功成名就)本质上: UTF-8是对 Unicode的压缩,用尽量少的二进制去与文字进行对应。
Unicode码位范围 UTF-8
oo00 ~ 0o7E 用1个字节表示
0080 ~ 07FE 用2个字节表示
0800 - FFFE 用3个字节表示
10000 ~ 10FFFF 用4个字节表示
压缩流程:
- 第一步:选择转换模板
码位范围(十六进制) 转换模板
0000 ~ 007F 0XXXXXXX
0080 ~07FF 110XXXXX 10XXXXXX
0800 - FFFE 1110XXXX 10XXXXXX 10XXXXXX
10000 ~ 1OFEFF 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX
例如:
"B”对应的 Unicode码位为0042,那么他应该选择的一个模板。
"a”对应的 Unicode码位为01E3。则应该选择第二个模板。
“李”对应的 Unicode码位为674E,则应该选择第三个模板。
😁对应的 Unicode码位为1F601,则应该选择第四个模板。
注意:一般中文都使用第三个模板(3个字节),这也就是平时大家说中文在UTF-8中会占3个字节的原因了。
- 第二部:在模板中填入数据
李->674E->110 011101 001110
根据模板去套入数据
1110XXXX 10XXXXXX 1OXXXXXX
1110XXXX 10XXXXXX 10001110
11100110 10011101 10001110
# 即,先转为二进制,而后根据几个×对应几位数,从后往前补充,不够补0
😁->1F601-> 11111 011000 000001
11110XXX 10XXXXXX 10XXXXXX 10XXXXXX
11110XXX 10XXXXXX 10XXXXXX 10000001
11110XXX 10XXXXXX 10011000 10000001
11110XXX 10X11111 10011000 10000001
11110000 10011111 10011000 10000001
4.5 Python相关的编码
- 字符串(str) Unicode处理
- 字节(byte) UTF-8 or gbk编码
v1 = "李"
"李".encode("UTF-8")#P70
"李".encode("gbk")
将一个字符串写入到一个文件中。
name="一giao我里giao"
data=encode("UTF-8")
#打开一个文件
file_object = open ( "log.txt ",mode="wb" )
#在文件中写内容
file_object.write(data)
#关闭文件
file_object.close( )
总结
- ASCII编码、 Unicode字符集、UTF-8编码本质上都是字符与二进制的关系
- ASCII,字符和二进制的对照表。
- Unicode,字符和二进制(码位)的对照表。
- UTF-8,对 Unicode字符集的码位进行压缩处理,间接也维护了字符和二进制的对照表。
- Ucs2和Ucs4指的是使用多少个字节来表示 Unicode字符集的码位。
- 目前最广泛的编码为: UTF-8,他可以表示所有的字符且存储或网络传输也不会浪费资源(对码位进行了压缩)。
- 二进制、八进制、十进制、十六进制其实就是进位不同。
- 基于Python实现二进制、八进制、十进制、十六进制之间的转换。
- 一个字节8位
- 计算机中常见单位之间的关系。
- 汉字,用gbk编码需要用2个字节;用UTF-8编码需要用3个字节。
- 基于Python实现将字符串转换为字节(UTF-8编码)
#字符串类型
name ="乔布斯"
#字符串转换为字节类型
data = name.encode("utf-8")
#把字节转换为字符串
data.decode("utf-8")
10.基于Python实现将字符串转换为字节(gbk编码)
11.计算机中的所有数据都是以二进制的形式去执行和存储的。