Day5 垃圾回收机制,程序与用户交互,运算符

1.垃圾回收机制

回收机制(简称 GC)是Python自带的一种机,专门用来回收不可用的变量所占用的内存空间。 程序运行的过程中会申请大量的内存空间,对于一些无用的内存空间如果不及时清理的话会导致内存使用殆尽(内存溢出),导致程序崩溃,因此管理内存是一件重要且繁琐的事情,而Python解释器自带的垃圾回收机制把程序员从繁杂的内存管理中解放出来。

1.1理解GC需要储备的知识

变量名与值内存地址的关联关系存放于栈区

变量值存放于堆区,内存管理回收的则是堆区的内容

1.2直接引用和间接应用

直接引用指的是从栈区出发直接引用到的内存地址。

​ 间接引用指的是从栈区出发引用到堆区后,再通过进一步引用才能到达的内存地址。

2.垃圾回收机制原理分析

Python的GC模块主要运用了“引用计数”(reference counting)来跟踪和回收垃圾。在引用计数的基础上,还可以通过“标记-清除”(mark and sweep)解决容器对象可能产生的循环引用的问题,并且通过“分代回收”(generation collection)以空间换取时间的方式来进一步提高垃圾回收的效率。

引用计数:引用计数一旦变为0,其占用的内存地址就应该被解释器的垃圾回收机制回收。(无法解决 循环引用问题)

标记清除:​ 标记/清除算法的做法是当应用程序可用的内存空间被耗尽的时,就会停止整个程序,然后进行两项工作,第一项则是标记(栈区相当于“根”,凡是从根出发可以访达直接或间接引用)的,都称之为“有根之人”,有根之人当活,无根之人当死。)二项则是清除。

基于引用计数的回收机制,每次回收内存,都需要把所有对象的引用计数都遍历一遍,这是非常消耗时间的,于是引入了分代回收来提高回收效率,分代回收采用的是用“空间换时间”的策略。

代回收的核心思想是:在历经多次扫描的情况下,都没有被回收的变量,gc机制就会认为,该变量是常用变量,gc对其扫描的频率会降低,分代指的是根据存活时间来为变量划分不同等级(也就是不同的代)新定义的变量,放到新生代这个等级中,假设每隔1分钟扫描新生代一次,如果发现变量依然被引用,那么该对象的权重(权重本质就是个整数)加一,当变量的权重大于某个设定得值(假设为3),会将它移动到更高一级的青春代,青春代的gc扫描的频率低于新生代(扫描时间间隔更长),假设5分钟扫描青春代一次,这样每次gc需要扫描的变量的总个数就变少了,节省了扫描的总时间,接下来,青春代中的对象,也会以同样的方式被移动到老年代中。也就是等级(代)越高,被垃圾回收机制扫描的频率越低。

3,程序与用户交互

用户交互就是人往计算机中input/输入数据,计算机print/输出结果,为了让计算机能够像人一样与用户沟通交流,所以有了用户交互。交互的本质就是输入、输出。

3.1输入input

username=input('请输入您的用户名:')
请输入您的用户名:jack # username = "jack"
>>> password=input('请输入您的密码:')
请输入您的密码:123 # password = "123"

了解知识:
# 1、在python2中存在一个raw_input功能与python3中的input功能一模一样
# 2、在python2中还存在一个input功能,需要用户输入一个明确的数据类型,输入什么类型就存成什么类型(如果输出了一个错误的数据类型会报错,用户体验极差)

3.2输出print

print('hello world') # 只输出一个值
hello world
>>> print('first','second','third') # 一次性输出多个值,值用逗号隔开
first second thir

3.3格式化输出

把一段字符串里面的某些内容替换掉之后再输出,就是格式化输出。

我们经常会输出具有某种固定格式的内容,比如:'亲爱的xxx你好!你xxx月的话费是xxx,余额是xxx‘,我们需要做的就是将xxx替换为具体的内容。

3.3.1占位符%

%s占位符:可以接收任意类型的值

print('my age is %s' %18)
print('my age is %s' %[1,23])
print('my age is %s' %{'a':333})

%d占位符:只能接收数字

print('my age is %d' %"18")

注意:照位置与%s一一对应,少一个不行,多一个也不行

3.3.2str.format(兼容性好推荐使用)

按照位置传值
res='我的名字是 {} 我的年龄是 {}'.format('egon',18)
print(res)

res='我的名字是 {0}{0}{0} 我的年龄是 {1}{1}'.format('egon',18)
print(res)

打破位置的限制,按照key=value传值
res="我的名字是 {name} 我的年龄是 {age}".format(age=18,name='egon')
print(res)

3.3.3f:python3.5以后才推出

x = input('your name: ')
y = input('your age: ')
res = f'我的名字是{x} 我的年龄是{y}'
print(res)

4.运算符

4.1算术运算符

,# print(10 + 3.1)
# print(10 + 3)
# print(10 / 3) # 结果带小数
# print(10 // 3) # 只保留整数部分
# print(10 % 3) # 取模、取余数
# print(10 ** 3) # X的几次方

4.2比较运算符

>、>=、<、<=、==、!=print(10 > 3)print(10 == 10)
print(10 >= 10)
print(10 >= 3)

name=input('your name: ')
print(name == ‘hero’)

4.3赋值运算符

4.3.1 = 变量的赋值

age = 18

4.3.2增量赋值

age += 1 # age=age + 1

4.3.3链式赋值

x=10
y=x
z=y
(z= y = x = 10 # 链式赋值)

4.3.4交叉赋值

m=10
n=20
print(m,n)
交换值
temp=m
m=n
n=temp
print(m,n)

(m,n=n,m # 交叉赋值 print(m,n))

4.3.5解压赋值

salaries=[111,222,333,444,555]
# 把五个月的工资取出来分别赋值给不同的变量名
# mon0=salaries[0]
# mon1=salaries[1]
# mon2=salaries[2]
# mon3=salaries[3]
# mon4=salaries[4]

(mon0,mon1,mon2,mon3,mon4,mon5=salaries

#解压赋值 应的变量名少一个不行对应的变量名多一个也不行)

引入*,可以帮助我们取两头的值,无法取中间的值

取前三个值
x,y,z,*_=salaries=[111,222,333,444,555] # *会将没有对应关系的值存成列表然后赋值给紧跟其后的那个变量名,此处为_
print(x,y,z)
print(_)

取后三个值
*_,x,y,z=salaries=[111,222,333,444,555]
print(x,y,z)

posted @ 2020-06-02 16:56  闲酒肆中听风吟  阅读(139)  评论(0)    收藏  举报