第二章 基础语法
2.1 编码
2.1.1 编码的本质
编码的本质是文字与二进制的队友关系。
乱码:在加码和解码的时候,采用不同的编码方式
2.1.2 编码的类型
1. ASCII
www.lookuptables.com
最早期的一种编码类型,采用固定的一个字节来表示与二进制的对应关系
因此只存在英文字母和少量字符与二进制的队友关系
A 65 10000001 bin(65)
2. GBK
在BGK2312这种编码类型的基础上发展出来的(已经拥有了亚太地区国家文字与二进制的对应关系)
- 采用固定的一个字节来表示与二进制的对应关系。
- 采用固定的两个字节来表示与二进制的队友关系。
3. Unicode
unicode-table.com
-
万国码,它为全球的每一个文字都提供一个二进制的码位
-
ucs2
- 采用固定的两个字节来表示对应关系
-
ucs4
- 采用固定的四个字节来表示对应关系
- 例如:一 563B
-
-
缺陷:存储常见的字母,相比于ASCII更浪费空间。
- 因此内存中进行计算的时候采用定长的Unicode编码:内存提供临时性的存储,因此并不会像硬盘那样存储大量的数据。
- 而在硬盘中采用GBK或者utf-8的编码方式存储,更节约空间
4.UTF-8
-
Unicode 编码的一种压缩,用尽可能少的二进制来表示对应关系
- 采用固定的一个字节来表示对应关系
- 采用固定的两个字节来表示对应关系
- 采用固定的三个字节来表示对应关系
- 采用固定的四个字节来表示对应关系
硬盘数据存储和网络传输时候,需要转换为UTF-8的编码
2.2 进制换算
2.2.1 进制在Python中的表示
十进制 int
二进制 bin
八进制 oct
十六进制 hex
2.2.2 进制转换方法
1. 十进制转换为二进制
n1 = 100
v1 = bin(n1) # 将十进制换算成二进制
v2 = oct(n1) # 将十进制换算成八进制
v3 = hex(n1) # 将十进制换算成16进制
print(v1)
print(v2)
print(v3)
0b1100100
0o144
0x64
2. 将其他进制转换为十进制
n1 = 100
v1 = bin(n1) # 将十进制换算成二进制,没有base参数,默认base参数为10
v2 = oct(n1) # 将十进制换算成八进制
v3 = hex(n1) # 将十进制换算成16进制
v4 = int(v1, base=2) # 将二进制转换成十进制
v5 = int(v2, base=8) # 将八进制转换为十进制
v6 = int(v3, base=16) # 将十六进制转换为十进制
print(v4)
print(v5)
print(v6)
100
100
100
2.3 常用函数
2.3.1 print函数
函数的基本理解:可以看做是将具有某种功能的代码进行打包的一个集合,这样方便以后进行调用。
1. print函数的功能
print("Hello World")
print(10)
print("*******")
Hello World
10“* * * * * * *”
2. 常用参数
-
end
print函数默认都会在末尾加上换行符,即默认情况下end=“\n”
print("停车坐爱枫林晚")
print("霜月红于二月花")
停车坐爱枫林晚
霜月红于二月花
print("停车坐爱枫林晚", end="")
print("霜月红于二月花")
停车坐爱枫林晚霜月红于二月花
-
sep
输出多个元素的时候,sep可以定义多个字符输出时候的连接符,默认为空格
print("停车坐爱枫林晚", "霜月红于二月花", sep="-")
停车坐爱枫林晚-霜月红于二月花
2.3.2 input
- 作用:接收键盘输入的内容,转化为字符串类型进行输出
user = input("请输入用户名:")
print(user)
print(type(user))
请输入用户名:100
100
<class ‘str’>
2.4 变量
2.4.1 变量的本质
变量就是一个容器,完整的变量由三部分组成:变量名、变量名、内存地址。
2.4.2 变量定义和调用
name = "电视" # 变量名为name,变量值为“电视”
address = id(name) # 将变量name对应的内存地址提出取来
print(address) # 打印变量的内存地址
print(name) # 打印变量值
2484035704736
电视
2.4.3 变量定义规则
1. 变量只能是数字、下划线和字符组合
name = "张三"
李四 = "lisi"
print(name)
print(李四)
张三
lisi
2.变量的首个字符不能是数字
1name = "张三"
3. Python中特殊含义的字符不能作为变量名
这些字符如果做了变量名,则失去原字符的含义作用。例如:print,or,and,with,break,continue…
2.4.4 变量命令规范
1. 驼峰体
StudentId = "123054" # 一般定义类的时候会采用驼峰体,两个单词连接,首字符都大写,中间的I大写类似骆驼峰
2. 下划线连接体
Student_id = "123456" # 一般定义普通变量的时候会采用
3. 选择变量名的时候尽量使用英文
xuehao = "123456" # 采用中文拼音的命名,可以,但是不推荐这样声明变量
mingzi = "zhangsan" # 采用中文拼音的命名,可以,但是不推荐这样声明变量
2.4.5 变量的修改与删除
- 场景1
name = "张三"
print(id(name)) # 打印name变量的内存地址
- 场景2
name = "张三"
print(id(name)) # 打印name变量的内存地址
name = "李四"
print(id(name)) # 打印重新赋值后的内存地址,验证是修改了内存中的数据还是修改了变量连接的内存地址
2472764823456
2472765974256从输出结果可以看出,修改的时内存地址,即“张三”和“李四”先后被赋值给同一个变量,但是两者保存在不同的地址,变量完成赋值了修改了内存地址位置,实现赋值。
- 场景3
name = "张三"
print(id(name)) # 打印name变量的内存地址
new_name = name
print(id(new_name)) # 打印new_name变量的内存地址
1623016462240
1623016462240从输出结果来看,新的变量名是直接连接到旧的变量值的内存地址,没有另外开辟内存空间存储相同的值。
- 场景4
num = 18
print(id(num))
age = str(num)
print(id(age))
140722610392024
2088969649680从输出结果来看,两个变量num和age由于变量类型不相同,虽然有相互赋值的情况,但是在内存中的地址仍然不同
- 场景5
name = "张三"
del name # 删除变量name,后续无法打印name
print(name)
- 场景6
name = "张三"
new_name = "李四"
print(id(name))
print(id(new_name))
n = new_name
new_name = name
name = n
print(id(name))
print(id(new_name))
3128344631200
3128346502816
3128346502816
3128344631200从输出上看,通过中间变量赋值,调换了两个变量名原本的内存指针,,内存地址中的值没有变化。
2.5 注释
在编写代码的时候,我们需要对某些内容进行注释,解释器会忽略注释后的代码,不会执行
2.5.1 单行注释
1. 可以直接在行尾手工添加#号输入注释内容
name = "张三" # 这是一个单行注释
print(id(name)) # 打印name变量的内存地址
new_name = name
print(id(new_name)) # 打印new_name变量的内存地址
2. 可以单用一行,对下一行进行注释
# 打印π
pirnt =(3.141592653589793)
3.还可以再定义函数的时候注释:
在函数中输入三引号(连续按三次双引号)输入一个注释
def login()
"""
这是一个函数的注释
:return:
"""
pass
2.5.2 多行注释
写好代码后,选中行,按Ctrl+?键,可以将多行一起注释,也可以只注释一行
# name = "张三"
# new_name = "李四"
# print(id(name))
# print(id(new_name))
# n = new_name
# new_name = name
# name = n
# print(id(name))
# print(id(new_name))