一.垃圾回收机制
什么是垃圾回收机制
垃圾回收机制是python自带的一种机制,专门回收没有绑定变量名的垃圾数据,用来释放内存空间
策略一:引用计数
引用计数就是:变量名和数据值关联的次数
age = 18 #数据值18的引用计数为1
引用计数增加:
x = age #数据值18的引用计数为2
'把age的内存地址给了x,此时age和x都绑定了18 所以18的引用计数为2'
引用计数减少:
age = 20 #数据值18的引用计数变成1
'变量名age与数据值18解除绑定,再与20绑定,所以数据值18的引用计数从2变成了1'
del x #数据值18的引用计数变成0
'解除变量名m的绑定关系,所以数据值18没有变量名绑定,引用计数就从1变成了0'
【引用计数】:当数据值身上的引用计数为0,就会被垃圾回收机制回收。 不为0则不会被回收
缺陷:引用计数可能会造成循环引用
问题
策略二:标记清除
标记清除策略主要是针对引用计数中循环引用
问题而出的策略
循环引用:
l1=[1,2,3] #l1列表的引用计数为1
l2=[4,5,6] #l2列表的引用计数为2
l1.append(l2) #在l1列表后追加l2的数据,l2列表的引用计数变为2
l2.append(l1) #在l2列表后追加l1的数据, l1列表的引用计数变为2
del l1 #解除l1变量名与l1列表的绑定关系,l1列表的引用计数变为1
del l2 #解除l2变量名与l2列表的绑定关系,l2列表的引用计数变为1
'此时l1列表与l2列表身上的引用计数不为0且没有变量名绑定,则会一直占用内存空间!'
【标记清除】:当内存占用达到某个临界值时,将内存中所有数据值检查一遍,对存在循环引用的数据打上标记,之后一次性清除
缺陷:每隔一段时间会对所有数据进行检查然后统一清除,资源消耗过大且效率不高
策略三:分代回收
为了减轻标记清除带来的资源消耗过大
问题出了分代回收策略
【分代回收】:分代回收一般分为三代:新生代、青春代、老年代。 对新定义变量的值放在新生代中,假设每隔5分钟检查一次,当多次检查发现该值仍在引用则把该值放到下一层青春代中。青春代的扫描频率低于新生代。老年代同理
可以把分代回收比喻成学校老师检查,差学生老师每5分钟看一眼有没有在开小差;中等生老师每隔10分钟看一眼;好学生老师每隔20分钟看一眼。
此时也反应出一个缺点:假如数据值刚转移到老年代就被解除绑定关系,那需要等好久才能检查到该数据值没被绑定,所以回收会有延迟
二.流程控制
流程控制:就是控制事物的执行流程
。
事物的执行流程:
1.顺序结构
#从上到下依次执行代码
2.分支结构
#根据条件的不同执行不同代码
3.循环结构
#根据条件的不同决定是否重复执行代码
流程控制必备知识
1.python中使用代码的缩进来表示代码从属关系缩进一般为4个空格
。缩进的子代码是否执行取决于上面没缩进的父代码。
2.目前只有if 、elif 、 else
关键字可以拥有子代码。
3.当某行代码需要子代码时,结尾需跟冒号
。
4.同属于一个父代码的子代码们缩进量需一致
。
5.相同缩进量的代码无主次之分,按照顺序结构依次执行
。
1.分支结构
1.单if分支
if 条件:
条件成立后执行的子代码
练习:
如果:女人的年龄>30岁,打印“阿姨好”
age = int(input('输入女人年龄:'))
if age > 30:
print('阿姨好')
2.if..else分支
if 条件:
条件成立后执行的子代码
else:
条件不成立执行的子代码
练习:
如果:女人的年龄>30岁 打印“阿姨好”,否则打印“小姐姐好”
age = int(input('输入女人年龄:'))
if age > 30:
print('阿姨好')
else:
print('小姐姐好')
3.if..elif..else分支
if 条件1:
条件1成立后执行的子代码
elif 条件2:
条件1不成立,条件2成立后执行的子代码
else:
以上条件都不成立后执行的子代码
#三个一起使用时永远只会走一个分支
#elif可以写多个
#elif 和 else不能单独使用,必须结合if一起使用
练习:
如果:成绩>=90,那么:优秀
如果成绩>=80且<90,那么:良好
如果成绩>=70且<80,那么:普通
其他情况:很差
score = int(input('输入学生成绩>>:'))
if score >= 90:
print('优秀')
elif score >= 80:
print('良好')
elif score >= 70:
print('普通')
else:
print('很差')
4.if的嵌套
if 条件1:
条件1成立执行的子代码
if 条件2:
条件2也成立后执行的子代码
if 条件3:
条件3也成立后执行的子代码
else:
条件3不成立执行的子代码
else:
条件2不成立执行的子代码
else:
条件1不成立执行的子代码
#if后可以继续跟if else可以最后再补但是需注意缩进量是否与父代码一致
练习:
如果:看到妹子上去要微信(可能成功,可能失败),成功后邀请妹子看电影(可能成功,可能失败),成功后邀请妹子回家看猫翻跟头(可能成功,可能失败)
is_wechat = input('是否要到微信(y/n):')
is_movie = input('是否约到看电影(y/n):')
is_home = input('是否约到回家看猫翻跟头(y/n):')
if is_wechat == 'y':
print('成功要到微信')
if is_movie == 'y':
print('成功约到看电影')
if is_home == 'y':
print('成功约到回家看猫翻跟头')
else:
print('没约到回家看猫翻跟头')
else:
print('没约到看电影')
else:
print('没要到微信')
2.循环结构
1.while循环
while 条件:
条件成立后执行的循环体代码
'''
1.先判断条件是否成立,成立则执行循环体代码
2.循环体代码执行完会再回到条件判断处判断是否成立
3.成立则继续执行循环体代码
4.直到条件不成立才会结束循环
'''
#循环打印“你好”
while True:
print('你好')
结束循环体的两种方式
1.利用计数器固定循环次数
#循环打印5次“你好”
count = 1
while count < 6:
print('你好')
count += 1
2.在循环体内部添加关键字
强制结束
⛅while + break的使用
强制结束循环体代码
#循环打印1-10,打印到5结束打印
count = 1 #定义计数器
while count < 11: #循环打印次数为10
print(count) #打印计数器
count += 1 #计数器自增1
if count == 6: #当计数器等于6时
break #强制结束循环
#结果为:1 2 3 4 5
⛅while + continue的使用
当执行到continue时结束本次循环,并回到循环体条件判断处开始下一次循环
#循环打印1-5,到3跳过并继续打印
count = 1 #定义计数器
while count < 6: #循环打印次数为5
print(count) #打印计数器
count += 1 #计数器自增1
if count == 3: #当计数器=3时
count += 1 #计数器自增1
continue #结束本次循环开始下一次循环
#结果为:1 2 4 5
⛅while + else的使用
循环体代码没有被break强制结束,循环体代码全部执行完就会执行else子代码
count = 1
while count < 6:
print(count)
count += 1
else:
print('循环体代码全部执行完且没有被break!则执行else')
#结果为: 1 2 3 4 5 循环体代码全部执行完且没有被break!则执行else
标签:count,控制,流程,else,计数,引用,print,代码
From: https://www.cnblogs.com/oreoz/p/16736085.html