首页 > 编程语言 >垃圾回收、python中的流程控制

垃圾回收、python中的流程控制

时间:2022-09-27 20:57:55浏览次数:66  
标签:循环体 python 代码 回收 else 垃圾 print 引用

垃圾回收机制

1.概念

  • 垃圾回收机制(GC):是Python解释器自带一种机制,专门用来回收不可用的变量值所占用的内存空间

2.原理

  • Python的垃圾回收机制(GC)主要使用引用计数(reference counting) 来跟踪和回收垃圾。在引用计数的基础上,通过"标记-清除" (mark and sweep)解决容器对象可能产生的循环引用问题,通过 "分代回收"(generation collection) 以空间换世界的方法提高垃圾回收效率
  • python采用的是引用计数机制为主,标记-清除和分代收集两种机制为辅的策略

3.引用计数

  • 引用计数:变量值被变量名关联的次数
  • 引用计数存在一个致命缺陷:循环引用导致内存泄漏
    • 解决办法:标记清除、分代回收、手动GC
1  name = 'jason'           # 'jason'被关联了一个变量名name,称之为引用计数为1
2  name1 = name             # 把name的内存地址给了name1,而name、name1都关联了'jason',所以'jason'的引用计数为2
3 del name1                 # 解除'jason'和name1的关联,'jason'身上的引用计数变为1
当数据值身上的引用计数为0的时候    就会被垃圾回收机制当做垃圾回收掉
当数据值身上的引用计数不为0的时候  永远不会被垃圾回收机制回收

4.标记清除

  • 专门用于解决循环引用的问题,将内存中程序产生的所有数据值全部检查一遍,查看是否存在循环引用,存在则打上标记 ,之后一次性清除
  • 标记:遍历所有的GC Roots对象(栈区中的所有内容或者线程都可以作为GC Roots对象),然后将所有GC Roots的对象可以直接或间接访问到的对象标记为存活的对象,其余的均为非存活对象,应该被清除。
  • 清除:清除过程中遍历堆中所有的对象,将没有标记的对象全部清除
  • 标记清除算法时,发现栈区内不再有l1与l2(只剩下堆区内二者的相互引用),于是列表1与列表2都没有被标记为存活,二者会被清理掉,这样就解决了循环引用带来的内存泄漏问题。
1   l1 = [11, 22]
2   l2 = [33, 44]
3   l1.append(l2)         # l1 = [11, 22, l2列表]   引用计数为2
4   l2.append(l1)         # l2 = [33, 44, l1列表]   引用计数为2
5   del l1                # 解除变量名l1与列表的绑定关系,列表引用计数减一
6   del l2                # 解除变量名l1与列表的绑定关系,列表引用计数减一
当内存占用达到临界值的时候 程序会自动停止 然后扫描程序中所有的数据
并给只产生循环引用的数据打上标记 之后一次性清除

5.分代回收

  • 因为标记清除每隔一段时间就需要将所有的数据排查一遍,资源消耗过大,所以为了减轻资源损耗,开发了分代管理。
  • 分代回收:是一种以空间换时间的操作方式,Python将内存根据对象的存活时间划分为不同的集合,每个集合称为一个代。
  • 分代回收的核心思想是:在历经多次扫描的情况下,都没有被回收的变量,gc机制就会认为,该变量是常用变量,gc对其扫描的频率会降低,
  • Python将内存分为了3“代”,分别对应三个链表,它们的垃圾收集频率与对象的存活时间的增大而减小。
    • 年轻代(第0代):新创建的对象分配在年轻代,年轻代链表的总数达到上限时,Python垃圾收集机制就会被触发,把不会回收的对象移到中年代
    • 中年代(第1代):不会回收的对象移到中年代
    • 老年代(第2代):老年代中的对象是存活时间最久的对象,存活于整个系统的生命周期内。

流程控制的理论

1.流程控制的概念:

  • 本质:事物的执行流程
  • 事物的执行流程:
    • 顺序结构:从上到下依次执行
    • 分支结构:根据条件的不同执行不同的代码
    • 循环结构:根据条件判断是否一直在做某件事
      image

流程控制中的必备知识

1.python中使用代码的缩进来表示代码的从属关系
  从属关系:缩进的代码(子代码)是否执行取决于上面没有缩进的
2.并不是索引的代码都可以拥有缩进的代码(子代码)
if关键字
3.如果有多行子代码属于同一个父代码 那么这些子代码需要保证相同的缩进量
4.python中针对缩进量没有具体的要求 但是推荐使用四个空格(windows中tab键)
5.当某一行代码需要编写子代码的时候  那么这一行代码的结尾肯定需要加上冒号
6.相同缩进量的代码彼此之间平起平坐  按照顺序结构依次执行

分支结构

  • 基本使用:需要用关键字if编写分支结构

单if分支结构

  • if条件:条件成立之后执行子代码
    • 条件可以是布尔值,也可以是表达式
    • 判断条件可以是一个,也可以是由逻辑运算符链接的多个
username = input('username>>>:')
if username =='jason':
    print('老师好')
#嵌套
	if 1:
        print('哈哈')
print('hhhh')    

image

if...else分支

  • if条件:条件成立之后执行的子代码
  • else条件:条件不成立执行的子代码
  • 判断条件可以是一个,也可以是由逻辑运算符链接的多个
username = input('username>>>:')
if username =='jason':
    print('老师好')
else:
    print('www')

image

if...elif...else分支结构

  • if 条件1:条件1成立之后执行的子代码
  • elif 条件2:条件1不成立 ,条件2成立执行的子代码
  • elif 条件3:条件1和2都不成立,条件3成立执行的子代码
  • else: 上述条件都不成立,执行的子代码
  • 中间的elif可以写多个、上述子代码永远只会走一个
  • elif和else都不能单独使用,必须结合if
score = input('请输入学生成绩')
score = int(score)   # 将字符串的整数转换成整型的整数
if score > '90':
    print('优秀')
elif score > '80':
    print('良好')
elif score > '70':
    print('一般')
elif score > '60':
    print('及格')
else:
    print('挂科重修')

image

if的嵌套使用(有点难)

age = 28
height = 170
weight =110
is_beautiful = True
is_success = True
username = 'tony'
if username == 'tony':
    print('tony发现目标')
    if age < 30 and height > 160 and weight < 150 and is_beautiful:
        print('大妹子 手机掏出来 让我加微信')
        if is_success:
            print('吃饭 看电影 天黑了...')
        else:
            print('去你妹的 流氓')
    else:
         print('看电影太无聊')
else:
    print('癞蛤蟆')

image

循环结构

  • 本质:想让一些代码反复的执行
    while 条件:
    条件成立之后执行的子代码(循环体代码)
    1.先判断条件是否成立
    2.如果成立则执行循环体代码
    3.循环体代码执行完毕后再次回到条件判断处 判断条件是否成立
    4.如果成立 则继续执行循环体代码
    5.按照上述规律依次执行 直到条件不成立才会结束循环体代码的执行
count = 1
while count < 5:
    print('hello world')
    count +=1
print('下课了')
break  # 强行结束循环体
   while循环体代码一旦执行到break会直接结束循环
continue # 直接跳到条件判断处
   while循环体代码一旦执行到continue会结束本次循环 开始下一次循环

while 条件:
           循环体代码
else:
           循环体代码没有被强制结束的情况下 执行完毕就会执行else子代码

image

作业

1.根据用户输入内容打印其权限
'''
jason --> 超级管理员
tom --> 普通管理员
jack,rain --> 业务主管
其他 --> 普通用户
'''
image
2.编写用户登录程序
要求:有用户黑名单 如果用户名在黑名单内 则拒绝登录
eg:black_user_list = ['jason','kevin','tony']
如果用户名是黑名单以外的用户则允许登录(判断用户名和密码>>>:自定义)
eg: oscar 123
image

标签:循环体,python,代码,回收,else,垃圾,print,引用
From: https://www.cnblogs.com/wxlxl/p/16735948.html

相关文章

  • Python之垃圾回收机制与流程控制
    python之垃圾回收机制与流程控制目录一、垃圾回收机制二、流程控制1.流程控制理论2.流程控制的必备python知识3.流程控制之分支结构(ifelse语句)(1)单if分支结构(2)if...el......
  • Python基础5
    今日内容概要垃圾回收机制流程控制理论流程控制必备知识分支结构循环结构作业今日内容详细垃圾回收机制  有一些语言内存空间的申请和释放都需......
  • 垃圾回收机制/控制流程/分支结构/循环结构
    今日内容详细垃圾回收机制流程控制理论/必备知识分支结构循环结构1.垃圾回收机制:#在一些编程语言中内存的申请以及它的释放都需要程序员自己编写代码才可以实现......
  • python之基本数据类型
    python之基本数据类型目录基本数据类型(知识点整合)1.整型int2.浮点型float3.字符串string4.列表list5.字典dictionary6.布尔值bool7.元组tuple8.集合set基本数据类型(知......
  • 垃圾回收机制和流程控制三大重点
    今日分享垃圾回收机制流程控制理论(*****重点)流程控制之分支结构(*****重点)流程控制之循环结构(******重点)垃圾回收机制"""有一些语言内存空间的申请和释放......
  • 【python】使用python处理excel数据
      目标使用python处理excel文件的数据,基本操作包括:excel文件读写,增删sheet页。 调研python-pandas模块 实现读 写    sheet页修......
  • python进阶之路5
    作业讲解1.获取用户输入并打印成下列格式 ------------infoofJason-----------Name:JasonAge:18Sex:maleJob:Teacher-------......
  • 垃圾回收机制 流程控制理论
    今日内容垃圾回收机制'''有一些语言内存空间申请和释放都需要程序员自己写代码才可以完成但在python里垃圾回收机制自动管理'''1.引用计数name='sun......
  • 进入python的世界_day5_python基础——流程控制
    写在开头,昨天是补全了八种常见数据类型的剩下三种、用户交互、常用运算符,今天主要学习流程控制很重要昨日作业补充另一种方法:原理:可以将表格整体看成是一个字符串......
  • python基础知识
    垃圾回收机制1.引用计数​name='jason'数据值jason身上的引用计数为1​name1=name数据值jason身上的引用计数加一为2​delname1......