5、内存管理机制和运算符
1、内存管理机制
垃圾回收机制GC
引用计数
分代回收
标记/清除
小整数池
2、与用户交互
接收用户输入
格式化输出
3、运算符
一、内存管理机制
一 垃圾回收机制GC
1.1 引用计数
引用计数增加
x = 18 # 值18的引用计数为1
y = x # 值18的引用计数为2
l = [111, x] # 值18的引用计数为3
print(id(x))
print(id(y))
print(id(l[1])) 三者的id相同
引用计数减少
del x # 值18的引用计数为2
y = 100 # 值18的引用计数为1
del l[1] # 值18的应用计数为0
1.2 分代回收:为了解决引用计数的效率问题
问题:个别垃圾有可能得不到及时的清理
1.3 标记/清除:为了解决循环引用带来的内存泄漏问题
核心:一个变量值没有任意一条可以从栈区出发到自己的引用,就会被标记下来,方便后续清除
例:
l1 = [111]
l2 = [222]
l1.append(l2)
l2.append(l1)
print(l1) # l1 = [111的内存地址,l2的内存地址]
print(l2) # l2 = [222的内存地址,l1的内存地址]
del l1 111的计数变为1
print(l2[1][0])
del l2 222的计数变为1
111和222的引用计数都不为0,但是没有任意一个变量可以从栈区出发到引用他们,就会被标记下来,方便后续清除
二 小整数池
-5~256(目前比这个范围更大)
x = 100000
y = 100000
x = "abc"
y = "abc"
print(id(x))
print(id(y))
二、与用户交互
1、接收用户输入
python3中的input会把用户输入的所有内容都存成str类型
age = input("请输入您的年龄: ") # "内容"
print(age,type(age)) 此时输入的数字为str类型
age=int(age) 经过这个流程可以将str类型转变成int类型
print(age > 10) # "18" > 10 如果没有上一个操作那就无法进行大小比较
补充:int可以把纯数字组成的字符串转换整型
int("31") # ok
res = int(" 31 ") # ok
res = int("3 1") # no 两个数字之间不能有空格
print(res,type(res))
python2(***)
raw_input()与python3的input一模一样
input()要求用户必须输入一个明确的数据类型,输入什么类型就存成什么类型
2、输出
print("hello1",end='*')
print("hello2",end='*')
print("hello3",end='*') 可以显示在同一行,可以把'*'换成'',正常后面有一串默认代码:end='\n'。
msg = "my name is %s my age is %s" % ("egon", "18")
msg = "my name is %s my age is %d" % ("egon", 18)
msg = "my name is %s my age is %s" % ("egon", 18)
msg = "my name is %s my age is %s" % ("egon", [1,2,3])
print(msg)
三、基本运算符
1 算术运算符
x = 10
y = 20
print(x + y)
print(10 + 20)
print(10 // 3) 相除取整
print(10 / 3) 相除
print(10 % 3) 相除取余
print(10 ** 2) 2次方
print(10 + 3.1) int和float的数值均可以使用算术运算符
了解:+与* 可以用在str类型中,但不推荐。
print("abc"+"def")---------->abcdef
print([1,2,3]+[3,4,5])------->[1,2,3,3,4,5]
print("abc"*3)
print([1,2,3]*3)
补充:python是一门解释型、强类型、动态语言
补充:go是一门编译型、强类型、静态语言
2 比较运算符
判断是否相等,没有类型限制
print("abc" == 10) # 判断的是值及其类型是否相等
print("abc" != 10) # 判断的是值及其类型是否不相等
> >= < <=:主要用于数字类型
print(10 > 3.1)
了解:> >= < <=也可以给其他类型用,但仅限于同类型之间
x = "abcdefg"
y = "abz"
print(x > y)------->False
x = [111, 'abcdefg', 666]
y = [111,'z']
print(x > y)------->False
3 赋值运算符
3.1 增量赋值
age = 18
age += 1 # age = age + 1------>此时age=19
age -= 1 # age = age - 1------>此时age=18
print(age)
3.2 链式赋值
x = y = z = 100
3.3 交叉赋值
x = 100
y = 200
temp = x
x = y
y = temp
del temp