今日内容
- 垃圾回收机制
- 引用计数
- 标记清楚
- 分代回收
- 与用户交互
- 接收用户输入
- input:py3,py2
- 格式化输出
- 按照某种格式,往格式里传入不同的值,%,format,f’{}’
- 接收用户输入
- 基本运算符
- 算术运算符
- 赋值运算符:交叉,链式
- 比较运算符
- 逻辑运算符:and not or
- 成员运算符:in
- 身份运算符:is
正课
垃圾回收机制
直接引用:变量名直接关联变量值
x = 10
y=x
print(y) # 10的引用计数为1
间接引用:容器通过变量名访问,只出现在容器类型里(字典列表集合)
l = ['a',x]
print(l[2]) # 10的引用计数为2
什么是垃圾回收:简称GC,python解释器自带的一种机制
为什么要用:帮助管理内存
怎么用:python解释器自己运行
列表在内存中的存储方法
-
列表不存放真正的值,而是存放列表名与值绑定的内存地址,等于是个值的内存地址的目录。
-
取到索引对应值的内存地址,再通过这个内存地址找到对应的值
x = 10 l=['a',x] # 此处的x存的是 10 的内存地址,而不是x对应的值 x=123 # 新开辟一个内存地址,将x与10解绑,再将x与10绑定,10的内存地址和值不变 print(l[1]) # l[1]仍然指向10的内存地址,所以输出结果 10
交叉引用
-
对两个列表l1和l2
l1 = [111,] l2 = [111,] l1.append(l2) # l1引用l2,计数+1 l2.append(l1) # l2引用l1,计数+1
则现在列表l1和l2之间存在相互引用
此时
del l1 del l2
解除l1,l2与其值的绑定关系,则此时无法被变量名访问到,应该被回收。但由于l1,l2互相引用,其引用计数不为0,所以无法被回收
标记清除
互相引用问题会导致垃圾无法被回收,标记清除就是用来清除循环引用情况下引用计数无法清除的垃圾
变量存储空间分为两个区域,堆区与栈区,变量名存放在栈区,变量值存放在堆区
标记清除不会时时启用,在内存将要耗尽才会启用
分代回收
标记清除只是引用计数的缺点的一个解决方案,主要的管理内存方法还是引用计数。引用计数要定时启动运行,效率较低
分代回收:用来降低引用计数的扫描频率,提升垃圾回收的效率
例子:对班上的人区别待遇,对尖子生检查作业的频率更少,对捣蛋的学生检查作业频率更高
分代回收的核心思想:在历经多次扫描的情况下,都没有被回收的变量,垃圾回收机制就会认为,该变量是常用变量,对其扫描的频率会降低
用户交互
- 什么是用户交互:
- 用户交互就是人往计算机中input/输入数据,计算机print/输出结果
- 为什么要有用户交互
- 为了让计算机能够像人一样与用户沟通交流,接收人的指令
- 怎么用
接收用户输入
接收用户的输入:input
user_name = input('输入用户名:')
print(user_name)
python3中input会将输入的所有内容保存成字符串类型
int()
:将纯数字组成的str转换成整型,若不是纯数字则报错
- python2中input:要求用户必须输入一个明确的数据类型,输入的是什么类型,就存成什么类型
- python2中
raw_input
与python3中一样,存成str
格式化输出
print
普通输出
格式化字符的三种形式:%,format,f
-
%s,%d:
-
右侧传值按顺序填入左边的%内,如果右边的值不够或多了都报错
name = 'deimos' age =18 print('my name is %s,my age is %s'%(name,age)) #按照变量接收值
-
以字典形式传值,不用按位置
name = 'deimos' age =18 print('my name is %(name)s,my age is %(age)s'%{'name':'deimos','age':18})
%d 只能传入整型,如果传入浮点型会得到整型
-
-
str.format (推荐使用)
-
format方法,按照位置传值
print('my name is{},my age is{}'.format('deimos'n18))
-
打破位置方法,按照key=value传值
print('my name is{name},my age is{age}'.format(age = 18, name = 'deimos'))
-
-
f:python3.5以后开始支持
-
x = input('input your name:') y = input('input your age:') res = f'my name is {x},my age is {y}'
-
三种方式速度有差别:
f > format > %s,推荐使用format,因为兼容性好
基本运算符
-
算术运算符:加减乘除
除法:
/
结果带小数,地板除//
结果只保留整数部分幂运算:
**
,取模:%
-
比较运算符:
> < >= <= == !=
返回结果True / False -
赋值运算符
-
增量赋值:age = age + 1,简写 :age += 1
变量名在左边,运算符号和等号黏在一起写
- age += 3 #age = age + 3
- age *= 3 #age = age ** 3
-
链式赋值:想要把一个值绑定给多个变量名
z = y = x = 10 # 相当于x=10,y=x,z=y
-
交叉赋值:把两个变量的变量值互换
以往可以用一个第三者变量,在覆盖变量前存储
x,y=y,x # python内部帮你做了这几步
交换完后x,y指向的内存地址交换
-
解压赋值:
要将列表中的多个值赋值,用索引一个个取值
lis = [111,22,33,44,55] a=lis[0] b=lis[1]
可以使用解压赋值
lis = [111,22,33,44,55] a,b,c,d,e=lis
这样赋值,如果左边变量个数与右边元素个数不一样会报错
引入 * 帮助我们取两头的值,无法取中间的值
-
lis = [111,22,33,44,55] a,b,*_=lis print(a,b,_) # 输出结果 111 22 [33, 44, 55]
其中 * 把列表中剩下没有赋值的元素,存成一个列表,赋值给下划线_
在python中通常用下划线_ 表示废弃的变量,仅用作占位
-
lis = [111,22,33,44,55] *_,a,b=lis print(a,b,_) # 输出结果 44 55 [111, 22, 33]
-
把要赋值的变量放在两头,中间用*_放不需要的元素,也可也
-
对字典进行解压赋值,得到的结果是字典的key
-
-