一、垃圾回收机制
1、什么是垃圾?
我们写代码过程中对变量引用过的一些值,在后续操作中这个值不在使用了,
没有变量能找到它了,我们称这个值是垃圾。
2、垃圾为什么要被回收
在我们编写代码的过程中会有给变量赋值的操作,赋值过程中会在内存空间
中为值开辟出一个空间来存储这个值,然后将值的内存地址给到变量。变量与值地
址所在区域我们称为栈区,值所在区域称为堆区,例如:x=10,y=20 如下图
当执行x=y时x会指向20,x与10的关系解除了,没有变量可以找到10了,
10也就没意义了,当这样的值多了会大量占用内存,导致内存溢出,所以需要
进行垃圾回收,释放内存空间
3、什么是垃圾回收机制
垃圾回收机制(简称GC)是Python解释器自带一种机,专门用来回收不可
用的变量值所占用的内存空间
4、垃圾回收机制的原理
4.1、引用计数
引用计数就是值被变量名关联的次数。
如:x=10
我们就说10被关联了一次
如果y=x,这样10也被y关联了,10的计数就 为2,这叫**计数增加**。
del x 将x的关联解除,10的计数变为1,这叫**计数减少**。
当计数被减为0时,该值没有变量与它关联,它就变为了垃圾,需要进行回
收
4.2、标记清除
有两个列表
l1 = [1,2,l2]
l2 = [1,2,l1]
可以看到俩个列表互相引用,你中有我,我中有你。但是,这样会出现一个
问题,我们说一个值被回收有个前提,是没有关联计数了,如果我们将l1、l2的
关联解除 :
del l1
del l2
这俩列表没有变量可以引用他们了,但由于他俩又在互相引用,引用计数不
为0,但是这俩列表又没有变量相关联也就不会被调用了,内存被占用。所以为了
解决这个问题引入了标记与清除。
再运行程序到内存快满的时候,程序会停下来,进行扫描标记,标记什么呢?
就是那些引用计数不为0,但是又没有变量引用的数据,进行清除,释放内存。
4.3、分代回收
分代回收是为了提升python的回收效率设定的以空间换时间的方法。
python会将数据进行分代,每次扫描垃圾时会将一些正在使用的值进行
标记,当标记积累到一定程度时会升代,然后,减少该值的扫描频率,增加扫描效
率。这会导致一些辈分高的数据不能及时回收,会占用内存空间,但会使扫描效
率加,所以说分代回收是以空间换时间
二、用户交互输入
1、交互
交互说白了就是人与计算机交流的过程,人进行信息输入(input)计算机进行结果
输出(print)例如:输入
user_name = input('请输入账号:')
user_password = input('请输入密码:')
输出
print(user == user_name)
print(password == user_password)
2、字符串格式化
2.1、为什么进行字符串格式化?
我们在需要输出某些固定格式的字符串时,例如:
‘’我们去***玩,坐***去,住***酒店”,我们需要将***替换成具体的内容,这
就需要就行字符串格式化。
2.2、如何格式化字符串
2.2.1、占位符
占位符例如%s、%d
print('我们去%s玩,坐%s去,住%s酒店,价钱是%d元' %('迪士尼','飞机',
'上海大酒店',100))
我们去迪士尼玩,坐飞机去,住上海大酒店酒店,价钱是100元
2.2.2、format
使用方式是:str.format
'''
1、
用户输入姓名、年龄、工作、爱好 ,然后打印成以下格式
------------ info of Egon -----------
Name : Egon
Age : 22
Sex : male
Job : Teacher
------------- end -----------------
'''
user_name = input('请输入姓名:')
user_age = int(input('请输入年龄:'))
user_work = input('请输入工作:')
user_like = input('请输入爱好:')
res = '''
------------ info of Egon -----------
Name : {name}
Age : {age}
Sex : {like}
Job : {work}
------------- end -----------------
'''.format(name=user_name, age=user_age, like=user_like, work=user_work)
print(res)
3、基本运算符
1.算数运算符
+ - * / // % **
print(10 + 3.1)
print(10 + 3)
print(10 / 3) # 结果带小数
print(10 // 3) # 只保留整数部分
print(10 % 3) # 取模、取余数
print(10 ** 3) # 幂运算
2、比较运算符
< > = <= >= !=
print(10 > 3)
print(10 == 10)
print(10 >= 10)
print(10 >= 3)
name=input('your name: ')
print(name == 'egon')
3、赋值运算符
= += -= *= %= /= //= **=
age = 18
age += 1 # age=age + 1
print(age)
age*=3
age/=3
age%=3
age**=3 # age=age**3
3.1、链式赋值
x=10
y=x
z=y
z = y = x = 10 # 链式赋值
print(x, y, z)
print(id(x), id(y), id(z))
3.2、交叉赋值
m=10
n=20
print(m,n)
交换值
temp=m
m=n
n=temp
print(m,n)
m,n=n,m # 交叉赋值
print(m,n)
3.3、解压赋值
salaries=[111,222,333,444,555]
mon0,mon1,mon2,mon3,mon4=salaries
print(mon0)
print(mon1)
print(mon2)
print(mon3)
print(mon4)
mon0,mon1,mon2,mon3=salaries # 对应的变量名少一个不行
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)
x,*_,y,z=salaries=[111,222,333,444,555]
print(x,y,z)
salaries=[111,222,333,444,555]
_,*middle,_=salaries
print(middle)
# 解压字典默认解压出来的是字典的key
x,y,z=dic={'a':1,'b':2,'c':3}
print(x,y,z)
4、成员运算符
只有一个 :in
1.判断一个字符或字符串是否在一个大字符串中
print("world" in "hello world")
print('w' in 'hello world')
2、判断元素是否在一个列表中
list1 = ['age','name','sex']
print('age' in list1)
3、判断key是否在字典中
dict1 = {'name':'dog','age':18,'sex':'play'}
print('name' in dict1)
4、not in
print ('world' not in 'hello world')
5、身份运算符
只有一个:is
作用:判断两个变量id是否相等
6、逻辑运算符
包含:not and or
优先级:not > and > or
1、逻辑非not #就是把跟在not后面的条件结果取反,即:真变假,假变真
# ps:not与紧跟其后的那个条件是一个不可分割的整体
print(not 16 > 13)
print(not True)
print(not False)
print(not 10)
print(not 0)
print(not None)
print(not '')
2、逻辑与 and #and用来链接左右两个条件,两个条件同时为True,最终结果
#才为真
print(True and 10 > 3)
print(True and 10 > 3 and 10 and 0) # 条件全为真,最终结果才为True
print( 10 > 3 and 10 and 0 and 1 > 3 ) # 偷懒原则
3、逻辑或 or#or用来链接左右两个条件,两个条件但凡有一个为True,最终结果就为True,
# 两个条件都为False的情况下,最终结果才为False
print(3 > 2 or 0)
print(3 > 4 or False or 3 != 2 or 3 > 2 or True) # 偷懒原则