一、垃圾回收机制详解:
1,引用计数
直接引用:直接将变量名跟值联系起来。
间接引用:容器类型存的是索引值和值的内存地址,其引用为间接引用
直接拨打电话和转分机号的区别
2,标记清除
由于存在循环引用的可能,就会导致无法被引用的值无法清除,因为引用计数不为0.
变量名存放于内存的:栈区
变量值存放于内存的:堆区
先扫描栈区的变量名,将与之间或直接引用的值标记为存活,其他堆区的值标记为失活。
再清除堆区就清除那些标记失活的(扫描栈区,标记堆区)
3,分带回收:分代回收的核心思想是:在历经多次扫描的情况下,都没有被回收的变量,
gc机制就会认为,该变量是常用变量,gc对其扫描的频率会降低。
二、与用户交互:
1,接收用户的输入:
user_name=input('请输入:')这个变量需要绑定变量名(即username=),否则会被系统
认为是垃圾清除了。
特点:输入什么都会被存成字符串
解决方案:age=int(xxx), int能且只能将纯数字的字符串转成整型。
2,字符串的格式化输出:把一段字符串里面的某些内容替换掉之后再输出,就是格式化输出
所有版本:% (按照%s一一对应值取值,数量必须严格相等)
usname=input('请输入名字:')
usage=input('请输入年龄:')
tex={'name':'zw','age':18,'hobit':'play'}
%s:
# res='my name is %s,and my age is %s' %(usname,usage)#列表内的变量的个数不能多不能少,顺序不能乱
# res= 'my name is %(name)s,and my age is %(age)s' %(tex)#字典里变量的个数只能多不能少,字典不讲究顺序
.format:
# res='my name is {0},my age is {1},my name is {1}'.format(usname,usage) #列表内的变量的个数不能多不能少,顺序可乱
# res='my name is {name},my age is {age}'.format(name=tex['name'],age=tex['age'])
#.format()这相当于一个字典,该字典的定义是key=value的形式且key不需要引号,等号右边可以是任一种类型的值(可以再嵌套列表或字典,
引用采用[]索引法),大括号内的name,age相当于key。
对比:用{}代替%s,用.format()代替%()
f
# res=f'my name is {name},my age is {age}'
# print(res)
三、运算符
1,算术运算符:+ - * /(取小数) //(取整) %(取余) **(指数运算).......
一般的数学运算,字符也能运算(+是拼接字符,*是复制字符,a*8即8个a)
2,比较运算符:> < >= <= ==(判断是否相等),!=(判断是否不等)
3,赋值运算符:
赋值运算符:=
增量赋值:+=2 (等于自身加2),*= ,/= , **=道理类似
链式赋值:连等于,x=y=z=10(相等于x=10,y=x,z=y)
交叉赋值:a,b=b,a,ab的值互换
解压赋值:a,b,c,d,e=list 列表里的数据个数和做左边的变量名的数量必须相等。
a,b,c,*_,d,e=list 代表将列表的前三个和后两个解压赋值,其他的打包给_,
*代表中间所以值,_代表无用变量名。
解压字典默认解压的是key