1、垃圾回收机制
python中的内存管理机制即垃圾回收机制(GC机制)有两方面的作用,一方面可以缓解内存的压力,防止出现内存溢出;另一方面让程序员从繁杂的内存管理工作中解放出来。
垃圾回收机制指的是当一个变量值无法被访问到,即无法被使用的时候,这个变量值就成为垃圾,就会被自动清除,释放出一部分内存空间。
通常情况下,python解释器认为一个变量值的引用计数为零,这个值就无法被使用了,就会被清除掉;但是存在特殊情况,在循环引用的情况下,值已经无法被使用了,但是值的引用计数不为0,这就出现了垃圾不能被清理的情况,内存发生泄漏;另一方面需要对每一个对象都进行引用计数监测,垃圾回收效率低下;为了解决这两个问题,在原有的GC机制之上,python引入了标记清除来解决循环引用带来的内存泄漏问题,引入了分代回收来降低引用计数的扫描频率,提升垃圾回收的效率。
标记清除:
标记过程就是遍历栈区中所有的对象,将所有可以直接或间接访问到的对象标记为存活的对象,其余的均为非存活对象。
清除的过程将遍历堆中所有的对象,将没有标记的对象全部清除掉。
分代回收:
核心思想是多次扫描都没有被回收的变量,GC机制就会认为该变量是常用变量,就会降低这个变量的扫描频率;引用计数的扫描频率降低,垃圾回收效率提高;这样做有一个不好的地方,就是可能有极少部分的垃圾不能及时清理,占用了一定的内存空间,但总体上来说,扫描时间变短了,是一种'时间换空间'的策略。
2、接收用户的输入
在Python3:input会将用户输入的所有内容都存成字符串类型。
username = input("请输入您的账号:") # "egon"
print(username, type(username))
age = input("请输入的你的年龄: ") # age="18"
print(age, type(age))
age=int(age) # int只能将纯数字的字符串转成整型
print(age > 16)
int("12345")
int("1234.5")
int("1234abc5")
在python2中:
raw_input():用法与python3的input一模一样
input(): 要求用户必须输入一个明确的数据类型,输入的是什么类型,就存成什么类型
3、字符串的输出
3.1 %
值按照位置与%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")
3.2 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)
3.3 f:python3.5以后才推出
x = input('your name: ')
y = input('your age: ')
res = f'我的名字是{x} 我的年龄是{y}'
print(res)
4、运算符
4.1 算数运算符
print(10 + 3.1)
print(10 + 3)
print(10 / 3) # 结果带小数
print(10 // 3) # 只保留整数部分
print(10 % 3) # 取模、取余数
print(10 **3) # 幂
4.2 比较运算符:>、>=、<、<=、==、!=
print(10 > 3)
print(10 == 10)
print(10 >= 10)
print(10 >= 3)
name=input('your name: ')
print(name == 'egon')
4.3 赋值运算符
4.3.1增量赋值
age = 18
age += 1 # age=age + 1
print(age)
age*=3
age/=3
age%=3
age**=3 # age=age**3
4.3.2 链式赋值
x=10
y=x
z=y
z = y = x = 10 # 链式赋值
print(x, y, z)
print(id(x), id(y), id(z))
4.3.3交叉赋值
m=10
n=20
print(m,n)
交换值
temp=m
m=n
n=temp
print(m,n)
m,n=n,m # 交叉赋值
print(m,n)
4.3.4解压赋值
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)