Day5 与用户交互和运算符以及垃圾回收机制

一、垃圾回收机制

1、什么是垃圾回收机制:垃圾回收机制(简称GC)是Python解释器自带一种机,专门用来回收不可用的变量值所占用的内存空间

2、为什么要用垃圾回收机制:程序运行过程中会申请大量的内存空间,而对于-些无用的内存空间如果不及时清理的话会导致内存使用殆尽(内存溢出),导致程序崩溃,
因此管理内存是一件重要且繁杂的事情,而python解释器自带的垃圾回收机制把程序员从繁杂的内存管理中解放出来。

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

①什么是引用计数:引用计数就是变量值被变量名关联的计数,计数一旦为0就会被解释器的垃圾回收机制清除。
②标记清除:用来解决循环引用带来的内存泄露问题(循环引用=>导致内存泄露),标记清除算法的做法是当应用程序可用的内存空间被耗尽的时,就会停止整个程序,然后进行两项工作,
第一项则是标记,第二项则是清除。
③分代回收:基于引用计数的回收机制,每次回收内存,都需要把所有对象的引用计数都查看一遍,这是非常消耗时间的,于是引入了分代回收来提高回收效率,分代回收采用的是用‘空间换时间”的策略。
分代回收的核心思想是:在历经多次扫描的情况下,都没有被回收的变量,gc机制就会认为,该变量是常用变量, gc对其扫描的频率会降低,提升回收的效率,但也有缺陷比如一个变量刚查完没问题,然后就解除了绑定关系,
由于刚扫描过系统认为他是常用变量扫描频率降低,会导致改变量的回收时间延时。

二、与用户交互

1、输入input 输出print 在python3中input会把输入内容存成字符串类型。

2、格式化输出:字符串的格式化输出:

值按照位置与%s一一对应,少一个不行,多一个也不行
# res="my name is %s my age is %s" %('egon',"18")
# res="my name is %s my age is %s" %("18",'egon')
# res="my name is %s" %"egon"
# print(res)

以字典的形式传值,打破位置的限制
# res="我的名字是 %(name)s 我的年龄是 %(age)s" %{"age":"18","name":'egon'}
# print(res)

%s可以接收任意类型
# print('my age is %s' %18)
# print('my age is %s' %[1,23])
# print('my age is %s' %{'a':333})
# print('my age is %d' %18) # %d只能接收int
# print('my age is %d' %"18")

str.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)

拓展:填充与格式化:
# 先取到值,然后在冒号后设定填充格式:[填充字符][对齐方式][宽度]
# *<10:左对齐,总共10个字符,不够的用*号填充
print('{0:*<10}'.format('开始执行')) # 开始执行******

# *>10:右对齐,总共10个字符,不够的用*号填充
print('{0:*>10}'.format('开始执行')) # ******开始执行

# *^10:居中显示,总共10个字符,不够的用*号填充
print('{0:*^10}'.format('开始执行')) # ***开始执行***

精度与进制
print('{salary:.3f}'.format(salary=1232132.12351))  #精确到小数点后3位,四舍五入,结果为:1232132.124
print('{0:b}'.format(123))  # 转成二进制,结果为:1111011
print('{0:o}'.format(9))  # 转成八进制,结果为:11
print('{0:x}'.format(15))  # 转成十六进制,结果为:f
print('{0:,}'.format(99812939393931))  # 千分位格式化,结果为:99,812,939,393,931

f:python3.5以后才推出
x = input('your name: ')
y = input('your age: ')
res = f'我的名字是{x} 我的年龄是{y}'
print(res)

三、基本运算符

1、算数运算符:
# print(10 + 3.1)
# print(10 + 3)
# print(10 / 3)  # 结果带小数
# print(10 // 3)  # 只保留整数部分
# print(10 % 3) # 取模、取余数
# print(10 ** 3) # 幂

2、比较运算符:==等于、!=不等于、>大于、>=大于等于、<小于、<=小于等于。

3、赋值运算符:
# age = 18
# age += 1  # age=age + 1
# print(age)
# age*=3
# age/=3
# age%=3
# age**=3 # age=age**3

4.链式赋值:
# x=10
# y=x
# z=y
# z = y = x = 10 # 链式赋值
# print(x, y, z)
# print(id(x), id(y), id(z))

5、交叉赋值:
m=10
n=20
# print(m,n)
# 交换值
# temp=m
# m=n
# n=temp
# print(m,n)

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

6、解压赋值:
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=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)

2020/3/05

猜你喜欢

转载自www.cnblogs.com/200024mc/p/12422743.html