Python基础部分:7、 垃圾回收机制和流程控制
一、垃圾回收机制
垃圾回收机制,简称GC,是python解释器自带的机制,专门用来进行垃圾回收。
再定义一个变量时,会申请内存空间,当该变量使用完毕也应该释放掉该变量占用的内存空间,在其他解释器中需要程序员手动释放掉内存,而python则由GC机制进行回收。
无论何种垃圾回收机制,一般都分为两个阶段:垃圾检测和垃圾回收。垃圾检测就是区分内存中“可回收”和“不可回收”内存。垃圾回收则是使操作系统重新掌握垃圾检测阶段所标识出来的“可回收”内存块。
所有垃圾回收,并不是指直接把这块内存的数据值清空了,而是将使用权重新交给了操作系统,不会被应用程序霸占了
1、引用计数
记录一个数据值被引用的次数,当该数据值的引用次数一旦为0,那么会被回收
a = 10 # 数据值10被引用,引用计数为:1
b = a # 数据值10再次被引用,引用计数为:2
del b # 数据值10引用次数被删除一次,引用计数为:1
当该数据值身上引用计数为0时,该数据会被垃圾回收机制进行回收;
当一个数据值身上的引用计数不为0时,该数据永远不会被垃圾回收机制回收
2、标记清除
引用计数存在缺陷:循环引用
当两个容器类型对象,内部分别将对方添加为元素,此时即便删除了变量名,这两个对象的引用计数容不能为0。
a = [10,15,17]
b = [3,5,6]
a.append(b)
a.append(b)
del a,b
标记清除就是为了解决“循环引用”的问题。其过程为:
- 寻找根对象(root object)的集合,root object就是一些全局引用和函数栈的引用。
- 遍历root object集合,对每一个引用可以直接或间接访问到的对象标记为存活的对象,其余均为非存活对象,应该被清除。
- 遍历堆中的所有对象,对未被标记的对象全部清除掉。
3、分类代收
在经历多次扫描的情况下,都没有被回收的对象,那么就认为,该变量是常用变量,对其的扫描频率会降低。具体的原理为:
分代指的是根据存活时间来为变量划分不同等级,也就是不同的代,垃圾回收的扫描频率会随着“代”的存活时间增大而减小。
“代”可以想象成链表,属于同一个代的对象都被连接在同一个链表中。在Python中总共存在三条链表,说明所有的对象可以分为三代:零代、一代、二代。一个“代”就是一条可收集对象链表。
第0代链表最多可容纳700个对象,一旦超过700这个阈值,那么会立即出发垃圾回收机制。
1代链表和2代链表触发垃圾回收的条件又是什么呢?当0代链表触发了10次垃圾回收的时候,会触发一次1代链表的垃圾回收。当1代链表触发了10次垃圾回收的时候,会触发一次2代链表的垃圾回收。
二、流程控制
1、理论
流程控制即:控制事物的执行流程
所有的程序,无论它的源码多么的庞大——即使是Windows操作系统,其程序也由三种基本结构组成:顺序结构、分支结构、循环结构
1、顺序结构
- 顺序结构是最常见、最简单,也是最容易理解的一种最基本的程序结构。
顾名思义,顺序结构就是程序从上到下依次执行的程序结构
2、分支结构
- 分支结构(也称选择结构)也是很容易理解的。就像树的主干向分枝延伸一样。
程序在同一时刻只选择执行其中一个分支。
3、循环结构
- 有时候我们需要重复地执行某些相似的任务,可以用循环结构来表示。
2、必备知识
1、python中使用代码的缩进来表示代码的从属关系;
从属关系:缩进的代码(子代码)是否执行取决于父代码是否执行
并不是所有的代码都可以拥有子代码:
只有拥有if关键字和结尾带冒号(:)的代码,可以拥有子代码;
如果多行子代码属于同一个父代码,那么这些子代码需要保证相同的缩进量;
相同缩进量的子代码彼此之间平起平坐,按照顺序结构依次执行;
Pthon中对缩进量没有具体要求,推荐使用4个空格键(快捷键:tab键)。
3、分支结构
1、单if分支结构
```
if 条件
条件成立后执行的代码
```
user_name = input('请输入用户名:') # 引导输入用户名
if user_name == 'kangkang' # 设置条件
print('好好学习') # 当用户名满足条件时将执行打印代码
2、if...else...结构
```
if 条件 :
条件成立后执行的代码
else :
条件不成立后执行的代码
```
user_name = input('请输入用户名:') # 引导输入用户名
if user_name == 'kangkang' # 设置条件
print('好好学习') # 当用户名满足条件时将执行打印代码
else:
print('请重新输入') # 上列if条件不成立时,执行此代码
3、if...elif...eles...结构
```
if 条件1 :
条件1成立后执行的代码
elif 条件2 :
条件1不成立后执行的代码
elif 条件3 :
条件1和2都不成立后执行的代码
else :
上述条件都不成立后执行的代码
```
user_name = input('请输入用户名:') # 引导输入用户名
if user_name == 'kangkang' # 设置条件
print('好好学习') # 当用户名满足条件时将执行打印代码
elif user_name == 'xiaoli' :
print('加油啊') # 上列if条件不成立时,执行此代码
elif user_name == 'xiaozhang' :
print('要努力哦') # 上列if和elif条件不成立时,执行此代码
else :
print('请重新输入') # 上列条件都不成立时,执行此代码
4、if的嵌套使用
flower = '玫瑰'
colour = '红'
price = 500
is_fresh = True
is_girlfriend = True
user_name = 'xiaoli'
if user_name == 'xiaoli':
print('花真好看')
if is_girlfriend:
print('买下来送给她吧')
if flower == '玫瑰' and colour == '红' and price == 500 and is_fresh:
print('买好了...回去送给她')
else:
print('再看看吧...')
else:
print('好可惜呀,没人送')
else:
print('视而不见...')
4、循环结构
while 循环
可以让一些代码反复的执行
while 条件:
条件成立之后执行的子代码(循环体代码)
代码实现:
user_name = 'kangkang' # 设置用户名
while user_name == 'kangkang': # 绑定条件
print('好好学习') # 循环输出...
* 先判断代码是否成立
* 如果成立则立即执行循环体代码
* 循环体代码执行完毕后再次回到条件判断处,判断条件是否成立
* 如果成立,则继续执行循环体代码
* 按照上述规律依次执行,直到条件不成立才会结束循环体代码的执行
break # 强制结束循环体
可强制结束一段循环执行的代码
break # 强行结束循环体
while循环体代码一旦执行到break会直接结束循环
代码实现:
user_name = 'kangkang' # 设置用户名
while user_name == 'kangkang': # 绑定条件
print('好好学习') # 循环输出...
break # 结束循环
continue # 直接跳到循环判断处
可以让一串循环执行的代码跳到代码判断处,重新判断
continue # 直接跳到条件判断处
while循环体代码一旦执行到continue会结束本次循环 开始下一次循环
代码实现:
number = 1 # 设置判断数据值
while number: # 设置循环条件
print('好好学习') # 循环打印
continue # 循环系统遇到此代码,将回到代码判断处,重新进行判断
break # 添加此代码是为了凸显continue代码的作用
- while...else...
while 条件:
循环体代码
else:
循环体代码没有被强制结束的情况下 执行完毕就会执行else子代码
代码实现:
number = 1 # 设置循环数据值
while number <= 10 : # 设置循环条件
number += 1
print('好好学习') # 打印
continue #
else: # 以上代码没有被强制结束,将按顺序向下执行
print('天天向上') # 打印此代码
Python基础部分:7、 垃圾回收机制和流程控制的更多相关文章
- python之MRO和垃圾回收机制
一.MOR 1.C3算法简介 为了解决原来基于深度优先搜索算法不满足本地优先级,和单调性的问题. python2.3版本之后不管是新式类还是经典类,查找继承顺序都采用C3算法 2.算法原理 C3算法的 ...
- python 全局变量与局部变量 垃圾回收机制
掌握L.E.G.B(作用域) 掌握局部作用域修改全局变量 步骤- 1.命名空间和作用域 命名空间:变量名称与值的映射关系作用域:变量作用的区域,即范围. 注意:class/def/模块会产生作用域:分 ...
- java基础学习之垃圾回收机制
回收过程: 1.发现无用的对象 2.回收无用对象占用的内存的空间. 垃圾回收相关算法: 1.引用计数法 堆中每个对象都有一个引用计数.被引用一次,计数加一.被引用变量值变为null,则计数减一. 到计 ...
- Day1 - Python基础1 介绍、基本语法、流程控制
Python之路,Day1 - Python基础1 本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼 ...
- Python基础1 介绍、基本语法 、 流程控制-DAY1
本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语 ...
- Day1 Python基础学习——概述、基本数据类型、流程控制
一.Python基础学习 一.编程语言分类 1.简介 机器语言:站在计算机的角度,说计算机能听懂的语言,那就是直接用二进制编程,直接操作硬件 汇编语言:站在计算机的角度,简写的英文标识符取代二进制去编 ...
- python基础--程序交互、格式化输出、流程控制、break、continue
在此申明一下,博客参照了https://www.cnblogs.com/jin-xin/,自己做了部分的改动 (1) 程序交互 #!/usr/bin/env python # -*- coding: ...
- 【python基础】第06回 运算符和流程控制 1
本章内容概要 1.运算符 2.流程控制 本章内容详解 1.运算符 什么是运算符? 运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算.例如:2+3,其操作数是2和3,而运算符则是" ...
- 【JVM基础】JVM垃圾回收机制算法
随机推荐
- 离线安装docker
一.安装步骤 1.下载Docker二进制文件(离线安装包) 下载地址:https://download.docker.com/linux/static/stable/x86_64/ 注:本文使用 do ...
- Spring 源码学习笔记10——Spring AOP
Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...
- linux中awk命令详解(最全面秒懂)
一:linux中awk命令 1.awk命令简介 AWK 是一种处理文本文件的语言,是一个强大的文本分析工具. 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinber ...
- 巧用KingbaseES中的动态DDL
概述 :在DBA的日常工作中,经常遇到一些需要基于数据库当前状态的实用程序查询的实例.比如一个逻辑复制的目标表,主键ID列与生成数据的序列不同步,这将导致插入新行是,会有主键冲突.要纠正这个问题,需要 ...
- SDUT 2022 Autumn Team Contest 7th
1.J题:给你T组数据,每一组数据给你一个区间,让你求这个区间的范围,区间的起始时间和终止时间可能被包含或重复 思路:思路的话,就是直接把给定的两个区间的之间的数包括端点存到vector去重,然后直接 ...
- Python 第五次实验
[1] (程序设计)编写程序,将二维列表数据写入 CSV文件(命名为"out.csv"),用逗号隔开.二维列表如下:[['Name','Age','Gender'], ['Bob' ...
- Java SE 4、继承
继承 基本语法 class 子类 extends 父类{ } 子类就会自动拥有父类定义的属性和方法 父类又叫 超类,基类,子类又叫 派生类 细节 子类继承了所有的属性和方法,非私有的属性和方法可以在子 ...
- 5.云原生之Docker容器网络介绍与实践
转载自:https://www.bilibili.com/read/cv15185166/?from=readlist 例如, 当在一台未经过特殊网络配置的centos 或 ubuntu机器上安装完d ...
- 创建一个 autocomplete 输入系统 - 前端 + 后端
文章转载自:https://mp.weixin.qq.com/s/uqchdrkhdFsof0ZFtECujg 我们经常在网站搜索输入时,会帮我们提醒自动完成的功能,比如: 图片 当我们在百度上搜索 ...
- 基于python的端口扫描
前言 端口扫描是指某些别有用心的人发送一组端口扫描消息,试图以此侵入某台计算机,并了解其提供的计算机网络服务类型(这些网络服务均与端口号相关).端口扫描是计算机解密高手喜欢的一种方式.攻击者可以通过它 ...