变量与基本数据类型
1. 变量
1.1 什么是变量
顾名思义,可以变化的量称为变量,这里可以理解为变化的状态。
1.2 为什么要有变量?
为了让计算机能够像人一样记忆事物的某种状态,并且状态是可以变化的。
具体来说,程序的运行过程中会伴随着一系列状态的变化,需要一种机制去保存记录程序执行过程中的状态以及变化过程。
1.3 使用方法
先定义,后引用
1.3.1 变量的定义
由三个部分组成,变量名,赋值符号,变量值,例如:
first_name = 'Dean'
age = 40
is_married = True
-
变量名可以类比为标签,指向值所在的内存地址,这是访问到这个值的唯一方式
-
= 为赋值符号,将值的内存地址绑定给变量
-
变量值是存储的数据,反映的是事物的状态
当解释器执行变量定义的语句时,会为变量值申请内存空间,并将内存地址绑定给变量名。
当需要这个变量值时,可以通过变量名来访问这个值。
变量的类型是由变量值决定的。
1.3.2 变量的原则和命名规范
原则:见名知意,通过变量名就能知道所指向的值代表什么,为了增加代码的可读性。
aaa = 18 # 这里并不能从变量名aaa得知18是什么意思
age = 18 # 可以得知18代表年龄
命名规范:
- 变量名只能由字母,数字和下划线组成,且不能以数字开头
- 变量名可以是中文,但不推荐
- 变量名不能与关键字重名
常用关键字包括:
‘and’, ‘as’, ‘assert’, ‘break’, ‘class’, ‘continue’, ‘def’, ‘del’, ‘elif’, ‘else’, ‘except’, ‘exec’, ‘finally’, ‘for’, ‘from’,‘global’, ‘if’, ‘import’, ‘in’, ‘is’, ‘lambda’, ‘not’, ‘or’, ‘pass’, ‘print’, ‘raise’, ‘return’, ‘try’, ‘while’, ‘with’, ‘yield’
1.3.3 变量的命名风格
- 驼峰体
每个单词的首字母大写,例如 FirstName = “Dean” - 纯小写加下划线,python中推荐使用
单词之间以下划线分隔,例如 first_name = “Dean”
1.3.4 变量的特性
- id
变量值的内存地址,可以通过函数id()获得
id()的返回值类型为整形int - type
变量值的类型,可以通过函数type()获得
type()的返回值类型为type类 - value
变量的值
1.3.5 is 与 ==
is:比较的是左右两个值的id是否相等,id相当于变量值的身份,所以is称为身份运算符
==:比较的是左右两个值是否相等
两块不同的内存空间可以存放相同的值,即
- 值相同,id可能不同。
- id相同,值一定相同,id不同,值可能相同。
即 x is y => x == y
2. 常量
2.1 变量的定义
在程序运行过程中不会改变的量
2.2 为什么要有常量?
在程序运行过程中,有些量被设计成固定的,不希望被改变
2.3 使用方法
Python中没有定义常量的语法。一般约定俗成,常量的命名风格为全部字母大写,例如:PI = 3.14
但从语法层面上来说常量的使用方法与变量一致。
3. 垃圾回收机制简述
垃圾:当一个变量值被绑定的变量名的个数为0时,该变量值无法被访问到,称之为垃圾。
引用计数是一种内存管理技术,是指将变量值被不同变量名的引用次数保存起来,当被引用次数变为零时就将其视为垃圾。
函数del() 可以解除变量名与变量值的绑定关系,使得该变量值的引用计数减一。
4. 小整数池简述
4.1 python的小整数池
对于整数(范围: [-5, 256]),解释器为了优化速度,将这些整数放入了固定的内存空间中,不会被垃圾回收。
单个字母也是这样的。
目的:为了优化运行速度,避免为整数频繁申请和销毁内存空间。
4.2 pycharm的优化机制
对于pycharm,每次运行将所有代码都加载到内存中,为大整数创建了内存空间,相当于大整数池,具体范围无需细究。
实际开发只能考虑小整数池,因为运行过程只依赖解释器,pycharm可有可无,pycharm的优化机制不是必须的。
5 基本数据类型简述
5.1 数字类型
- 整型 int
变量值为整数类型 - 浮点型 float
变量值为小数类型
数字类型可用于数学计算和比较大小等。
5.2 字符串类型
作用:记录描述性质的状态
定义:用引号(’’,"",’’’ ‘’’,""" “”")包含的一串字符
字符串的嵌套
注意:外层用单引号,内层应该用双引号,反之亦然
字符串之间可以使用加号进行拼接,但效率低。
5.3 列表
索引对应值,索引为从0开始的整数
作用:按一定的顺序存储多个值
定义:在中括号[]内用逗号分隔开多个任意类型的值,一个值称之为一个元素。
索引代表的是顺序和位置,对值没有描述性的功能
5.4 字典
键(key)对应值(value),其中key通常为字符串类型,唯一,对值提供描述性的信息。
作用:用来存多个值,每个值都有唯一的键与之对应,键对值具有描述性功能。
定义:在大括号{}内用逗号分开各多个键值对(key-value对)
5.5 布尔类型
用来记录真假这两种状态,通常用来当作判断的条件值。
值只有两种:True和False
5.6 小结
如何选择合适的类型来记录状态
- 选取的类型是否可以明确标识事物的状态
- 存不是最终目的,存的目的是为了之后可以取出来用
- 把自己想象成一台计算机,首先思考应以何种形式把事物的状态记到脑子里,然后再找相应的数据类型来存储。
5.7 练习
5.7.1 存储练习
- 病毒程序需要定期将监控到的数据写入日志文件,请记录下日志文件路径C:\a\b\c\adhsvc.dll.system32,方便后期处理
要点:注意字符串中 \ 的转义
log_file_path = r'C:\a\b\c\adhsvc.dll.system32'
- 病毒程序在上传文件时,发送的报头数据里需要包含文件信息:文件名a.txt、大小360,请记录下文件信息
file_info = {
'file_name': 'a.txt',
'file_size': 360
}
- 程序运行过程中有一段错误日志需要记录下来,错误日志为"上传文件失败"
error_log = '上传文件失败'
- 假设我收到一条信息要记录,信息为中病毒客户端的信息"[2020-02-18-17:00:48] 癞蛤蟆病毒感染者-> 80.82.70.187:33649 正在上传数据"
import time
receive_info = {
'send_time': time.strptime('2020-02-18-17:00:48', '%Y-%m-%d-%H:%M:%S'),
'send_name': '癞蛤蟆病毒感染者',
'send_ip': '80.82.70.187',
'send_port': '33649',
'send_action': '正在上传数据'
}
- 把服务端ip地址存放下来,ip地址为10.0.10.11
server_ip = '10.0.10.11'
- 病毒程序需要每隔3秒才运行一次,请记录下这个时间间隔
time_interval = 3
5.7.2 嵌套取值操作练习
- students_info=[[‘egon’,18,[‘play’,]],[‘alex’,18,[‘play’,‘sleep’]]]
请取出第一个学生的第一个爱好
students_info = [['egon', 18, ['play', ]], ['alex', 18, ['play', 'sleep']]]
target_hobby = students_info[0][2][0]
- 针对字典
info={
‘name’:‘egon’,
‘hobbies’:[‘play’,‘sleep’],
‘company_info’:{
‘name’:‘Oldboy’,
‘type’:‘education’,
‘emp_num’:40,
}
}
请取出取公司名
info = {
'name': 'egon',
'hobbies': ['play', 'sleep'],
'company_info': {
'name': 'Oldboy',
'type': 'education',
'emp_num': 40,
}
}
target_corp_name = info['company_info']['name']
- 针对下述类型
students=[
{‘name’:‘alex’,‘age’:38,‘hobbies’:[‘play’,‘sleep’]},
{‘name’:‘egon’,‘age’:18,‘hobbies’:[‘read’,‘sleep’]},
{‘name’:‘wupeiqi’,‘age’:58,‘hobbies’:[‘music’,‘read’,‘sleep’]},
]
取第二个学生的第二个爱好
students = [
{'name': 'alex', 'age': 38, 'hobbies': ['play', 'sleep']},
{'name': 'egon', 'age': 18, 'hobbies': ['read', 'sleep']},
{'name': 'wupeiqi', 'age': 58, 'hobbies': ['music', 'read', 'sleep']},
]
target_hobby = students[1]['hobbies'][1]