一、变量
1.1 什么是变量
变量就是可以变化的量,量指的是事物的状态,比如人的年龄、性别等等
变量用于存储在计算机程序中引用和操作的信息。它们还提供了一种用描述性名称对数据进行标记的方法,这样我们的程序就可以更清楚地被读者和我们自己理解。把变量看作容纳信息的容器是有帮助的。他们唯一的目的是在内存中标记和存储数据。然后可以在整个程序中使用这些数据。
Python环境中不区分常量和变量,所有的变量都是可变的,为了区分常量和变量,一般全部大写的为常量,小写的为变量
1.2 变量的组成
变量名,赋值符号,变量值
1.3 变量的三大特征
id:反映的是变量值的内存地址,内存地址不同id则不同
type:变量的类型,不同类型的值用来表示记录不同的状态
value:变量值本身
1.4 变量的命名规则
变量名只能是 字母、数字或下划线的任意组合,不可以是特殊字符或者空格
变量名的第一个字符不能是数字
以下关键字不能声明为变量名
['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']
变量的创建:变量=变量值
变量的删除:del 变量名
1.5 变量的命名风格:
驼峰体:首字母大写
纯小写加下划线(推荐)
1.6 变量的缓存机制
缓存机制
只有两个值相同,就只开辟一个空间
Number部分
1.对于整型而言,-5~正无穷范围内的相同值 id一致 小整数池
var1 = 100
var2 = 100
var1 = -6
var2 = -6
var1 = var2 = -100 # 相同的地址
print(id(var1) , id(var2))
2.对于浮点型而言,非负数范围内的相同值,id一致
var1 = -5.76
var2 = -5.76
print( id(var1) , id(var2) )
3.对于布尔值而言,值相同的情况下,id一致
var1 = True
var2 = False
print( id(var1) , id(var2) )
4.复数在 实数+虚数 这样的结构中永不相同(只有虚数的情况例外)
var1 = 3+4j
var2 = 3+4j
var1 = 90j
var2 = 90j
print( id(var1) , id(var2) )
容器类型部分:
1.字符串 和 空元组 相同的情况下,地址相同
var1 = "你"
var2 = "你"
var1 = ()
var2 = ()
print( id(var1) , id(var2) )
2.列表,元组,字典,集合无论什么情况 id标识都不同 [空元组例外]
var1 = (1,2,3)
var2 = (1,2,3)
print( id(var1) , id(var2) )
二、基本数据类型
2.1 什么是数据类型
说明数据的数据宽度、数据结构、数据的使用场景
2.2 数字类型
int整型
用来记录人的年龄,出生年份,学生人数等整数相关的状态
age = 18 print(type(age))
float浮点型:
用来记录人的身高,体重,薪资等小数相关的状态.
weight=123.45
print(type(weight))
2.3 字符串类型
Str:
用来记录人的名字,家庭住址,性别等描述性质的状态
在Python中,凡是用引号引起来的,全是字符串
字符串之间可以相加,但仅限于str与str之间进行
name="xiaoming"
print(type(name))
注:
用单引号、双引号、多引号,都可以定义字符串,本质上是没有区别的,但是需要考虑引号嵌套的配对问题,若内部有单引号,则外层需要用双引号;多引号可以写多行字符串
2.4 列表类型
列表类型:
list:
在[]内用逗号分隔开多个任意类型的值,一个值称之为一个元素
用来记录多个同种属性的值。
列表类型是用索引来对应值,索引代表的是数据的位置,从0开始计数
索引反映的是顺序、位置,对值没有描述性的功能
stu_names=['张三','李四','王五'] #d定义
print(type(stu_names)) #查看类型
print(stu_names[0])
列表可以嵌套,嵌套取值如下
students_info=[['tony',18,['jack',]],['jason',18,['play','sleep']]]
students_info[0][2][0] #取出第一个学生的第一个爱好
2.5 字典类型
dict:
用来记录来记录多个值,但多个值是不同属性的;
字典类型是用key:value形式来存储数据,其中key可以对value有描述性的功能
value可以是任意类型,但是key必须是不可变类型
person_info={'name':'tony','age':18,'height':185.3} #定义一个字典
person_info['name']
字典同样可以进行嵌套
>>> students=[
... {'name':'tony','age':38,'hobbies':['play','sleep']},
... {'name':'jack','age':18,'hobbies':['read','sleep']},
... {'name':'rose','age':58,'hobbies':['music','read','sleep']},
... ]
>>> students[1]['hobbies'][1] #取第二个学生的第二个爱好
'sleep'
2.6 元组
元组(tuple)与列表类似,不同之处在于元组的元素不能修改。元组写在小括号 () 里,元素之间用逗号隔开。
元组中的元素类型可以不相同;
tpl = ('aa','bb','cc',11,22,3.14,{"key":"value"},[1,2,3])
print(type(tpl))
print(tpl)
2.7 布尔类型
布尔类型:
bool
用来记录真假两种状态,通常用来当作判断的条件
2.8 如何选择合适的类型来记录状态
如何选择合适的类型来记录状态
1、选取的类型是否可以明确标识事物的状态
2、存不是目的,存的目的是为了日后取出来用,并且方便的用
3、把自己想象成一台计算机,如果我是计算机,
我会如何以何种形式把事物的状态记到脑子里, 然后再去python中找相应的数据类型来让计算机像自己一样去记下事物的状态
三、类型转换
3.1 自动类型转换
精度从低向高进行转换 : bool -> int -> float -> complex
自动类型转换,默认从低精度向高精度进行转换(从低到高)
自动类型转换是针对数字类型来说的
3.2 容器类型强制转换
容器类型的强制转换 (str list tuple set dict)
str
Number类型数据 str都可以转换
规律:基于原来的数据类型两边套上引号
list
规律: 如果是字符串,把里面的字符一个一个拿出来,作为列表的每一个元素
如果是其他容器数据,只是基于原数据,把两边的符号换成[] , 换成列表
如果是字典,只是单纯的获取字典的键,不要那个值,组成列表
tuple
规律:如果是字符串,把里面的字符一个一个拿出来,作为元组的每一个元素
如果是其他容器数据,只是基于原数据,把两边的符号换成() , 换成元组
如果是字典,只是单纯的获取字典的键,不要那个值,组成元组
set
规律:如果是字符串,把里面的字符一个一个拿出来,作为集合的每一个元素
如果是其他容器数据,只是基于原数据,把两边的符号换成{} , 换成集合
如果是字典,只是单纯的获取字典的键,不要那个值,组成集合
集合的特征:自动去重,无序
dict 强转字典
需要等长的二级容器,并且元素的总个数是2个;
字符串元素个数只能是1个,多一个都不行,有局限性,不推荐使用
四、垃圾回收机制
什么是垃圾回收机制:
垃圾回收机制(简称GC)是Python解释器自带一种机制,专门用来回收不可用的变量值所占用的内存空间
为什么要用垃圾回收机制:
程序运行过程中会申请大量的内存空间,而对于一些无用的内存空间如果不及时清理的话会导致内存使用殆尽(内存溢出),导致程序崩溃,因此管理内存是一件重要且繁杂的事情,而python解释器自带的垃圾回收机制把程序员从繁杂的内存管理中解放出来。
堆区与栈区
直接引用:
直接引用指的是从栈区出发直接引用到的内存地址
间接引用:
间接引用指的是从栈区出发引用到堆区后,再通过进一步引用才能到达的内存地址。
垃圾回收机制原理:
引用计数:
引用计数就是:变量值被变量名关联的次数,若引用次数为零,则变量就会被回收
标记清除:
用来解决循环引用带来的内存泄露问题
循环引用=>导致内存泄露
分代回收:
用来降低引用计数的扫描频率,提升垃圾回收的效率