01. 计算机的基本认识
1.1 计算机的组成
- 根据冯·诺伊曼(现代计算机之父)结构体系,计算机分为以下五部分。
- 存储器:指计算机中存储运算的数据的部位,实际硬件体现就是内存。
- 计算机中常见的用于存储数据的设备有内存和硬盘两种。
- 硬盘:用于持久化存储数据,一般是存储所有的数据(包括但不限于运算数据),因此不属于存储器。
- 内存:是一种闪存(临时存储),当程序启动时,程序中需要的数据会从硬盘加载到内存中;当程序退出或运行完毕时,内存中相关的数据就会被释放。
- 当计算机中同时运行的程序越多时,计算机的内存占用率也就越高。
- 计算机的内存占用率越高,计算机运行速度越慢(即越卡)。
- 后续课程中用Python实现的程序中的数据就是存储在内存中的。
- 相较于硬盘来说,内存是一种非常昂贵的资源。
- 运算器:从存储器中调度数据,并对其进行算术运算、逻辑运算等计算。
- 若存储器中没有对应的数据,程序计算过程中就会报错。
- 控制器:控制器相当于计算机的中枢神经,其作用就是对程序规定的控制信息进行解释,然后调度计算机的其他部分进行工作。
- 控制器 + 运算器 = 中央处理器,也就是所谓的CPU。
- 故CPU的作用就是解释执行计算机程序中的各条命令,然后调度相关的数据进行运算得到结果。
- 输入设备:将数据传递到计算机内部的设备,常见的有键盘、鼠标等。
输出设备:将数据从计算机内部向外传递的设备,常见的有显示器、打印机、音响、耳机等。
1.2 人机交互DOS命令
1.2.1 人机交互与DOC命令的基本概念
人机交互的方式有两种:
- 图形化界面交互:是最容易上手的一种交互方式。按照图形上的文字或者图形形成的指示作用,引导用户达成人机交互的目的。
- 命令交互:借助于控制台(Windows中的CMD、Linux中的Terminal),通过特定的指令,让计算机完成特定操作的行为。
- Windows中命令被称之为DOS命令,是面向磁盘的操作命令,可以操作目录、文件以及磁盘相关的其他内容。
在Windows系统还没有那么强大的图形化之前,所有的操作都是通过DOS命令完成的。
1.2.2 在Windows中使用DOS命令
使用快捷键
Win + R
打开运行窗口,然后输入cmd,接着点击确定或直接回车。
- 此时就会打开cmd.exe应用程序,它指向的路径是操作系统当前用户的用户目录,在
>
符号后面即可输入DOS命令。
1.2.3 常用的DOS命令
- 创建目录:
md [路径\]目录名
```powershell C:\Users\85034>md test # 在当前目录下创建目录
C:\Users\85034>md C:\Users\85034\Desktop\test # 在指定路径下创建目录
- 切换路径:`cd 路径`(路径可以是相对路径,也可以是绝对路径)
```powershell
C:\Users\85034>cd ..\Default # 相对路径切换。
C:\Users\Default>cd C:\ProgramData\Documents # 绝对路径切换。
C:\ProgramData\Documents>cd \ # 切换到当前盘符的根目录。
C:\>D: # 切换盘符。
D:\>cd abc # 若目标目录不存在,则会报错。
系统找不到指定的路径。
- 删除目录:
rd 目录路径
```powershell C:\Users\85034>rd test # 相对路径删除。
C:\Users\85034>rd C:\Users\85034\Desktop\test # 绝对路径删除。
C:\Users\85034>rd Documents\Python # 只能删除空目录,无法删除非空目录。 目录不是空的。
- 删除文件:`del 文件路径`
```powershell
C:\Users\85034\Documents\Python>del HelloWorld.py # 删除单个文件
C:\Users\85034\Documents\Python>del Hello.* # 删除指定文件名的所有文件
C:\Users\85034\Documents\Python>del *.txt # 删除指定格式的所有文件
C:\Users\85034\Documents\Python>del *.* # 删除所有文件
C:\Users\85034\Documents\Python>cd ..
C:\Users\85034\Documents>rd Python # 此时Python目录已经空了,因此可以正常删除了。
查看文件中的内容:
type 文件名
C:\Users\85034>type Documents\Python\HelloWorld.py
print("Hello World")
输入内容到控制台:
echo 文本内容
C:\Users\85034>echo Hello
Hello
重定向:一般结合
echo
命令使用,将内容输出到文件中;若输出的目标文件不存在,则会自动创建文件。>
:输出重定向,会清空目标文件中原因的内容,然后将指定的内容输出到清空后的文件中。>>
:追加重定向,在目标文件原有内容的默认新增一行,并在最后一行中输出指定内容。 ```powershell C:\Users\85034>echo ABC > text.txt
C:\Users\85034>type text.txt ABC
C:\Users\85034>echo DEF >> text.txt
C:\Users\85034>type text.txt ABC DEF
C:\Users\85034>echo GHI > text.txt
C:\Users\85034>type text.txt GHI
- 复制文件:`copy 源路径\文件名 目标路径\文件名`
```powershell
C:\Users\85034>copy text.txt C:\text.txt
已复制 1 个文件。
移动文件:
move 源路径\文件名 目标路径\文件名
C:\Users\85034>move C:\text.txt .\Documents\Python
移动了 1 个文件。
-
1.3 绝对路径与相对路径
在计算机中表示文件路径的方式分为绝对路径的相对路径两种。
- 绝对路径:
- 在Linux中,绝对路径即从根目录/开始写,一直到文件名结束的完整具体路径,如
/root/python/HelloWorld.py
。 - 在Windows中,绝对路径是从盘符开始写的,如
C:\Users\Admin\Documents\Python\HelloWorld.py
。
- 在Linux中,绝对路径即从根目录/开始写,一直到文件名结束的完整具体路径,如
相对路径:
- 两个基础的符号:
.
:参照物所在的当前目录;一般情况下.
可以省略,如.\HelloWorld.py
就可以直接写成HelloWorld.py
。..
:参照物所在的上一级目录。
- 相对路径是相对于两个具体的文件而言的。如
C:\Users\Admin\Documents\Python\HelloWorld.py
相对于C:\Users\Admin\Videos\Python\PythonLearning.mp4
就是..\..\Documents\Python\HelloWorld.py
,相对于C:\Users\Admin\Test.txt
就是.\Documents\Python\HelloWorld.py
。02. 进制
2.1 进制简介
2.1.1 进制的基本概述
- 两个基础的符号:
进制是人为规定的一种进位方式,x进制就是满x进一,如生活中常用的10进制就是每次满10就向高位进1。
- 计算机中常见的进制有:二进制、八进制、十进制、十六进制。
计算机底层是使用二进制存储数据的,其原因如下:
二进制:0、1,二进制的10表示十进制的2。
- 八进制:0、1、2、3、4、5、6、7,八进制的10表示十进制的8。
- 十进制:0、1、2、3、4、5、6、7、8、9,十进制的10表示十进制的10。
十六进制:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F,十六进制的10表示十进制的16。
十进制:没有任何修饰符号,默认就是10进制的,如14就是10进制的14。
- 二进制:二进制的英文为binary,因此用0bXXXX表示二进制数据,如0b1011就是10进制的11。
- 八进制:八进制的英文为octal,因此用0oXXXX表示八进制数据,如0o13就是10进制的11。
十六进制:十六进制的英文为hexadecimal,但用0xXXXX表示十六进制数据,如0x2D就是10进制的45。
2.1.4 八进制和十六进制出现的原因
二进制的两个缺点:
- 二进制的表达能力(可读性)较差。
- 二进制在显示和传输时太长了。
- 为了弥补二进制的两个缺点,因此八进制和十六进制就出现了。
八进制和十六进制出现的目的主要是为了简化二进制的显示,便于阅读和书写。
2.2 进制间的转换
2.2.1 十进制转二进制
基础规则:数据如果是整数,可直接计算;数据若为浮点数,则要将小数部分和整数部分拆开分别计算。
- 整数部分的转换规则:将数据除以2取余数,接着再将商除以2取余数,以此类推,直到商为1时停止。
- 示例1:十进制的27转换成二进制:
- 27 / 2 = 13 …… 1 二进制:0000 000 1
- 13 / 2 = 6 …… 1 二进制:0000 00 11
- 6 / 2 = 3 …… 0 二进制:0000 0 011
- 3 / 2 = 1 …… 1 二进制:000 1 1011
- 示例2:十进制的39转换成二进制:
- 39 / 2 = 19 …… 1 二进制:0000 000 1
- 19 / 2 = 9 …… 1 二进制:0000 00 11
- 9 / 2 = 4 …… 1 二进制:0000 0 111
- 4 / 2 = 2 …… 0 二进制:0000 0111
- 2 / 2 = 1 …… 0 二进制:00 10 0111
- 示例1:十进制的27转换成二进制:
- 小数部分的转换规则:将小数部分乘以2取整数部分的值,接着继续将乘积结果的小数部分乘以2取整数,直到小数部分为0。最后将所有的整数部分从上向下拼在一起即为最后的结果。
- 示例1:十进制的0.625转换为二进制:
- 0.625 * 2 = 1.25 整数部分:1
- 0.25 * 2 = 0.5 整数部分:0
- 0.5 * 2 = 1 整数部分:1
- 从上到下拼在一起:0b.101
- 示例2:十进制的0.2转换为二进制:
- 0.2 * 2 = 0.4 整数部分:0
- 0.4 * 2 = 0.8 整数部分:0
- 0.8 * 2 = 1.6 整数部分:1
- 0.6 * 2 = 1.2 整数部分:1
- 0.2 * 2 = 0.4 整数部分:0
- ……
- 可以发现0.2在转换时会出现循环,其结果为0b.00110011……00110011……。
- 但是计算机不可能任由数据无限循环的计算下去,因此一般会取几个高位数据,剩下的就舍弃了。
- 示例1:十进制的0.625转换为二进制:
因为计算机在计算数据时会将十进制的数据转换成二进制进行计算,而整型数据可以完美的从十进制转换成二进制,但浮点型数据的小数部分在计算时其小数部分转换成二进制可能造成进度缺失,这就导致了计算机在计算浮点型数据时可能不准确。
2.2.2 进制与权
权:对于多位数来说,某位上的数据N所表示的大小,称为该位上的位权。
- 以十进制为例,从右往左的顺序,第一位的位权是1,第二位的位权是10,第三位的位权是100,以此类推。
- 这就是导致在读数据时如5435会读成五千四百三十五,而非五四三五。
- 按照这个规律,一个十进制数N中第M位的位权为:,因此可以推出:
- 二进制M位的位权为:
- 八进制M位的位权为:
- 十六进制M位的位权为:
- N进制M位的位权为:
因此,二进制从右往左前十一位的位权分别是:1(1位) >> 2(2位) >> 4(3位) >> 8(4位) >> 16(5位) >> 32(6位) >> 64(7位) >> 128(8位) >> 256(9位) >> 512(10位) >> 1024(11位)
2.2.3 二进制转十进制
二进制转十进制的规律:将二进制上的数据按权展开求和,求得的结果就是其对应的十进制数。
- 示例1:求0b10111对应的十进制数。
- 示例2:0b1101 = 1 × 1 + 0 × 2 + 1 × 4 + 1 × 8 = 1 + 0 + 4 + 8 = 13
- 示例3:0b1110 = 0 × 1 + 1 × 2 + 1 × 4 + 1 × 8 = 0 + 2 + 4 + 8 = 14
示例4:0b11010 = 0 × 1 + 1 × 2 + 0 × 4 + 1 × 8 + 1 ×16 = 0 + 2 + 0 + 8 + 16 = 26
2.2.4 二进制转八进制
八进制中最大的符号为7,转换成二进制数就是0b0111,因此可以认为三个二进制位就可以表示一个八进制数据。
- 二进制转八进制的转换规则:将二进制数据从右往左,每三位一分,然后对每一份按权展开求和,再将和拼在一起就是八进制数据。
- 若最前面的数据不足三位,在高位补0即可。
- 如0b1101111展开即为:0b001, 101, 111。
- 示例1:0b110111010101转换成八进制数据。
- 从右向左每三位一分:0b110, 111, 010, 101
- 对每一份按权展开求和:110 -> 6 111 -> 7 010 -> 2 101 -> 5
- 将结果拼在一起:0o6725
- 示例2:0b110111011010转换成八进制数据。
- 从右向左每三位一分:0b110, 111, 011, 010
- 对每一份按权展开求和:110 -> 6 111 -> 7 011 -> 3 010 -> 2
- 将结果拼在一起:0o6732
示例3:0b110110001110转换成八进制数据。
十六进制中最大的符号是F(即15),用二进制表示位0b1111,因此可以认为四个二进制位就可以表示一个十六进制数据。
- 二进制转十六进制的转换规则:将二进制数据从右往左,每四位一分,然后对每一份按权展开求和,再将和拼在一起就是十六进制数据。
- 若最前面的数据不足四位,在高位补0即可。
- 如0b1101111展开即为:0b0110, 1111。
- 示例1:0b10110101100111转换成十六进制数据。
- 从右向左每四位一分:0b0010, 1101, 0110, 0111
- 对每一份按权展开求和:0010 -> 2 1101 -> D(13) 0110 -> 6 0111 -> 7
- 将结果拼在一起:0x2D67
- 示例2:0b101101110100111转换成十六进制数据。
- 从右向左每四位一分:0b0101, 1011, 1010, 0111
- 对每一份按权展开求和:0101 -> 5 1011 -> B(11) 1010 -> A(10) 0111 -> 7
- 将结果拼在一起:0x5BA7
示例3:0b1110111011011011转换成十六进制数据。
十六进制与八进制转二进制实际上就是2.2.4、2.2.5的逆过程。
- 示例一:0xA4CF转为二进制数据。
- 每位拆开转成四位二进制数:A(10) -> 1010 4 -> 0100 C(12) -> 1100 F(16) -> 1111
- 将结果拼在一起:0b1010010011001111
示例二:0o7451转为二进制数据。
计算机中一位二进制数(一个0或者一个1)表示一个位,单位为位(Bit,简写为b)。
- 计算机数据存储的最小单位为一个字节(Byte,简写为B),一个字节有八个位,因此计算机中0b10110一般写成0b0001 0110。
- 字节往上有千字节、兆字节、……,他们的转换进制都是1024。
- 转换率一开始是打算用1000为单位的,但是计算机底层的数据都是二进制,离1000最近的二进制整数就是1024。
- 1 >> 2 >> 4 >> 8 >> 16 >> 32 >> 64 >> 128 >> 256 >> 512 >> 1024。
计算机数据单位总结:
存储在计算机中的数据有数字、各国的文字、以及各种各样的符号。
- 编码:将数字、各国的文字、以及各种各样的符号转换成计算机可识别的二进制数据,这个过程就叫做编码。
解码:解码就是编码的逆过程,即将计算机认识的二进制数据解析成人类可读的数字、各国的文字、以及各种各样的符号。
4.2 编码方式
计算机是如何将人类的符号转换成二进制数据的,其参考的就是各种各样的编码集。
4.2.1 ASCII码
ASCII是美国信息交换标准代码,采用单字节【8位二进制数】存储数据,定义了数字符号、西欧符号、英文符号等128个符号的转换规则。
- ASCII码表:
- ASCII码转换规则:将字符映射成一个十进制数据,然后将十进制数据转换成对应的单字节二进制数据,并将二进制数据存储在计算机中。
几个重要的符号映射:
GB2312-80:国标
- GB2312-80是1980年制定的中国汉字编码国家标准。共收录7445个字符,其中汉字6763个。
- GB2312兼容标准ASCII码(即前128个符号是一样的),采用扩展ASCII码的编码空间进行编码。
- GB2312中一个汉字占用两个字节,每个字节的最高位为1。
- GBK:国标扩展
- 《汉字内码扩展规范》(GBK)于1995年制定,兼容GB2312、GB13000-1、BIG5编码中的所有汉字。
- GBK使用双字节编码,编码空间为0x8140~0xFEFE,共有 23940 个码位,其中GBK1区和GBK2区也是GB2312的编码范围。
- GBK收录了21003个汉字,向下与GB2312编码兼容,向上支持ISO 10646.1国际标准,是前者与后者中的一个承上启下的产物。
总结:字母、数字、符号等占用1个字节(8位),汉字占用2个字节(16位)。
4.2.3 Unicode
Unicode称为万国码,也称统一码。是国际编码标准,是由世界各国合作开发的,把世界各地各种文字编码都收录其中。
- Unicode有UTF-8、UTF-16、UTF-32几种将数字转换位程序数据的编码方案(UTF-8最常用)。
- UTF-8是以字节为单位对Unicode进行编码的。UTF-8的特点是对不同范围的字符使用不同长度的编码。对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。
- UTF-8编码的最大长度是4个字节。在存储汉字时,UTF-8采用的较多为三字节存储。
- Python这门语言就采用了UTF-8编码。