复习昨天
-
什么是变量?为什么要有变量? -
变量的三大组成部分是?每部分的作用是什么? -
变量名的命名原则、规范、风格 -
变量名的三个特征是什么?(id type 值 ) -
is与==的区别 -
id相同值是否可以相同? -
id不同值是否可以相同? -
用变量的定义说明int、float、str、list、dict、bool类型用于记录何种状态?
目录
一、垃圾回收机制(后续专门讨论)
引用计数
标记清除
分代回收
二、用户的交互
#接受用户输入
字符串的格式化输出
三、基本运算符
一、垃圾回收机制(后续专门讨论)
引用计数
?x = 10 ?# 直接引用
?print(id(x))
?y = x
?z = x
??
?l = ['a', x] ?# 间接引用
?print(id(l[1]))
垃圾回收机制(简称GC)是Python解释器自带的一种机制,专门用来回收不可用的变量值所占用的内存空间
注:列表和字典的内存空间中并不存放真正的值,只存放索引和值的内存地址()
?x = 10
?l = ['a','b',x]
?# l = ['a'的内存地址,'b'的内存地址,10的内存地址]
?x = 123
?print(l[2]) ?# 输出10,不影响l[2]指向的10的地址
?# 与强类型语言不一样,一旦赋值就会开辟新内存空间,原值被间接引用,不会被回收
标记清除
?l1 = [111]
?l2 = [222]
?l1.append(l2) ?# l1 = [值111的内存地址,l2列表的内存地址]
?l2.append(l1) ?# l2 = [值222的内存地址,l1列表的内存地址]
??
?# print(id(l1[1]))
?# print(id(l2))
??
?# print(id(l2[1]))
?# print(id(l1))
??
?del l1
?del l2
1、标记 通俗地讲就是:标记的过程就行相当于从栈区出发一条线,“连接”到堆区,再由堆区间接“连接”到其他地址,凡是被这条自栈区起始的线连接到内存空间都属于可以访达的,会被标记为存活
具体地:标记的过程其实就是,遍历所有的GC Roots对象(栈区中的所有内容或者线程都可以作为GC Roots对象),然后将所有GC Roots的对象可以直接或间接访问到的对象标记为存活的对象,其余的均为非存活对象,应该被清除。 #2、清除 清除的过程将遍历堆中所有的对象,将没有标记存活的对象全部清除掉。
直接引用指的是从栈区出发直接引用到的内存地址,间接引用指的是从栈区出发引用到堆区后再进一步引用到的内存地址
当我们同时删除l1与l2时,会清理到栈区中l1与l2的内容
这样在启用标记清除算法时,发现栈区内不再有l1与l2(只剩下堆区内二者的相互引用),于是列表1与列表2都没有被标记为存活,二者会被清理掉,这样就解决了循环引用带来的内存泄漏问题。
分代回收
什么时候扫描去检测循环引??
标记和清除的过程效率不?。清除?活动的对象前它必须顺序扫描整个堆内存,哪怕只剩下?部分活动对象也要扫描所有对象。
?
二、用户的交互
#接受用户输入
?username = input("请输入您的账号:")
?print(username, type(username))
??
?age = input("请输入您的年龄:")
?print(age, type(age))
?flag = int(age) > 18
?# 这里只能强转整数字符串
字符串的格式化输出
1、%
?# 按照位置传值
?res = "my name is %s my age is %s" %("xxx","18")
?print(res)
??
?# 按照键传值
?res2 = "my name is %(name)s my age is %(age)s" % {"name":"xxx","age":"18"}
?print(res2)
?# %s 可以接受任意类型
?# %d 只能接收int
2、str.format (兼容性好)
?# 按照位置传值
?res = '我的名字是{0}{0}{0},我的年龄是{1}{1}{1}'.format('xxx','20')
??
?# 按照键传值
?res = '我的名字是{name},我的年龄是{age}'.format(name = 'xxx', age = 20)
3、f python3.5以后才推出(速度最快)
?x = input('your name:')
?y = input('your age:')
?res = f'我的名字是{x} 我的年龄是{y}'
?print(res)
三、基本运算符
?# 1、算术运算符
?print(10 / 3) ?# 结果带小数
?print(10 // 3) ?# 只保留整数部分
?print(10 % 3) ?# 取模取余数
?print(10 ** 3) ?# 求10的三次方
?# 其余略
??
?# 2、比较运算符: >、<、<=、>=、!=、==
??
?# 3、赋值运算符
?# 3.1 变量的赋值
?age = 18
?# 3.2增量赋值
?age += 18
?age -= 18
?age %= 18
?age /= 18
?age **= 18
??
?# 3.3链式赋值
?z = y = x = 10 ?#链式赋值
??
?#3.4 交叉赋值
?m = 10
?n = 20
?m, n = n, m
?'''
?temp = m
?m = n
?n = temp
?'''
?print(m, n)
??
?# 3.5解压赋值
?salaries = [111, 222, 333, 444]
?'''
?mon0 = salaries[0]
?mon1 = salaries[1]
?mon2 = salaries[2]
?mon3 = salaries[3]
?'''
?mon0. mon1, mon2, mon3 = salaries
?# 对应的变量名和列表的值必须一一对应
??
?#取前三个值
?x, y, z, *_ = salaries ?
?# *会将没有对应关系的值存成列表,然后赋值给紧跟其后的那个变量名,此处为下划线
??
?# 取后三个值
?*_, a, b, c = salaries
|