Python垃圾回收机制 字符编码概述 字符编码相关操作 代码操作文件

垃圾回收机制

引入

在使用python编程的时候,电脑会存储数据,需要对存储空间进行申请和释放。
而中间的操作都不需要程序员的操作是因为python会自动执行以上操作

一般编程语言的编写

申请内存空间的代码
name = John
释放内存空间的代码

Python编写代码

只需要正常编写,省去了申请和释放内存空间的步骤
name = John
'''这一切归功于python能在编程时动态的管理电脑内存'''

python的垃圾回收机制工作原理

  • 引用计数
  • 标记清除
  • 分代回收

引用计数

name = 'John'  #当前数据值John的引用计数为1
name1 = 'John' #当前数据值John的引用计数为2
del name1	   #当前数据值John的引用计数为1

#当数据值的引用计数不为0的时候,表示该数据值还在使用,不删除
#当数据值的引用计数为0时,该数据值会被垃圾回收机制回收
'''引用计数存在一个坑''' >>> 循环引用

循环引用

在这里插入图片描述
运行结果
在这里插入图片描述

#上图中 两个变量都互相绑定了对方列表的新的索引值
del l1
del l2
#就算将两个变量解绑了对应的两个列表,
#但列表内的数据的引用计数不是0
#意味着回收机制识别不出这两个垃圾数据
'''这个现象被称为循环引用'''

那么该如何解决循环引用现象
这里我们就用到第二点’‘‘标记清除’’’

标记清除

这个方法就是通过将内存中程序产生的所有数据值
全部检查一遍是否存在循环引用来解决循环引用的问题
并将检测出存在的循环引用打上记号 然后一次性清除

分代回收

标记清除每间隔一段时间就需要将所有的数据排查一遍
这么做的资源消耗过大,所以就会有分代回收这一功能

以上为抽象分代回收流程图
以上为抽象分代回收流程图

为了减轻垃圾回收机制的资源消耗 python开发了三代管理
每一代管理比上一代管理时间间隔更长

字符编码

简介

*字符编码只针对文本文件,是文本文件才有的概念
*因为计算机内部存取数据的本质是:二进制(只能识别0和1)
所以人与计算机之间存在一个人类字符与数字的转换关系
于是就有'''字符编码表'''的存在,用于让计算机显示人类字符

发展史

  • 阶段一(一家独大)
    • 由于计算机是由美国人发明的,所以第一个编码表只能识别英文字符。(ASSCII码)
    • 因为所有的英文字符加起来不超过127个,同时美国人考虑以后可能会增添新的字符以备不时之需,所以使用了八位二进制来记录
    • 此时的计算机智能识别英文 不能识别其他文字
0000000(2的7次方等于128)00000000(八位)
A-Z			65-90
a-z			97-122
  • 阶段二(群雄割据)
    • 中国(GBK码):记录了中文字符,英文字符,数字的对应关系。并以 2bytes起步储存中文(生僻字会用更多字节),1bytes储存英文。
    • 韩国(Euc_kr码)
    • 日本(shift_JIS码)
此时的各国计算机文本文件无法直接交互,会出现乱码的现象
  • 阶段三(天下统一)
    • 万国码(unicode): 兼容万国字符
      (所有字符全部使用2bytes起步储存)
    这导致有时候不同语言的文本转换会产生巨大的文件大小差异
    
    • 于是就有了最后一个字符编码
      • utf家族(unicode transformation format)
    UTF是针对unicode的优化版本
    其中使用频率最高的是utf8
    内存使用的是兼容万国的万国码unicode,而硬盘使用的是utf来减少IO操作时间
    
    

字符编码实操

如何解决乱码

	用原存储文档时的编码解开

编码与解码

	编码(人类的字符>>>计算机的字符)
		将人类的字符按照指定的编码转换成计算机可以识别的数字
s1 =  ' 学不die就往die里学'
res = s1.encode('utf8')
print(res, type(res))

在这里插入图片描述

	解码(计算机的字符>>>人类的字符)
		将计算机能够识别的数字按照指定的编码转成人类可以读懂的字符
res1 = res.decode('utf8')
print(res1)

在这里插入图片描述

解释器层面

要注意的是python2默认的编码是ASCII码
只需要在代码的开头 加上 # coding:utf8(文件头:告诉解释器要使用什么编码), 然后在所有字符串前
添加字母 u(定义字符串) 即可运行python3的代码

*将来在使用python2定义字符串的时候,务必将所有字符串前加u 
字母u在字符串前的含义为 让python2解释器用 unicode存储字符串数据
*python3默认编码为utf8,不存在乱码的问题

文件操作

简介

文件可以理解为
操作系统展示给用户从而让用户可以操作计算机硬盘的方式之一。

文件操作就是通过编写代码让电脑自动操作文件的读写

如何用代码操作文件

首先新建一个文件 a.txt
在这里插入图片描述

那么该如何写代码去读取这个文件呢

res = open('a.txt','r',encoding='utf8')
print(res.read())  #通过这个代码就可以读取目标文件

在这里插入图片描述
然后关闭文件

res.close()

打开代码内的具体参数为

open(文件路径,读写模式,字符编码)
这个open有两种方式使用

第一种

f = open() #用一个变量接收open方法
print(f.read()) #显示读取的文字
f.colse() #关闭

第二种

with open('a.txt', 'r', encoding='utf8') as f:
	print(f.read())  #这个with语法的好处在于,当他的字代码运行结束后,会自动调用close()方法

以上f均为变量名,可以更换其他变量名

补充知识

可以通过在字符串前面添加'r'>>>resource 就可以取消字符串内的特殊含义

字符串前面加	f'{}' 格式化输出
			u 让python2解释器用 unicode存储字符串数据
			r 取消字符串内的特殊含义
'''如果编码是纯英文或数字 可以简写'''
res = 'John said no'
print(res.encode('utf8'))
print(b'John said no')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值