5.垃圾回收机制(GC)+用户交互+运算符(上)

1.垃圾回收机制详解(简称GC)

1.计数引用

x = 10  # 直接引用
print(id(x))
l = ['a', x]  # 间接引用
print(id(l[1]))
# 直接引用和间接引用,都会增加变量值的引用计数

1.1.列表在内存中的储存方式

x = 100
l = ['a', 'b', x]  # l=['a'的储存地址,'b'的储存地址,100的储存地址]
x = 123
print(x)  # 123
print(l[2])  # 100
# 所以即使x被赋予其他的值,l[2]中存储的依然是100的储存地址,打印出来还是100

2.标记清除

2.1循环引用带来内存泄露问题

l1 = [111, ]
l2 = [222, ]
l1.append(l2)
l2.append(l1)

del l1
del l2
#即使删除了两个列表,但因为两个列表互相间接引用,导致两个列表所指向的变量值
#的引用计数永远不会归零,导致内存泄漏
#在开发过程中,不要写互相引用的代码,不然想要清除这些变量值的内存占用
#只能等待标记清除了
#标记清除:内存中是分为堆和栈的,变量值存在堆里,变量名(地址指针)存在栈里,
#直接引用是变量名指向变量值,由栈指向堆
#间接引用是变量值指向变量值,堆内的互相指向
#标记清除,是指过一段时间,解释器将只由堆内互相指向产生的引用计数当垃圾清理

2.用户交互

1.接收用户的输入

# 在python3中,input会将用户输入的所有内容都存成字符串类型
username = input("请输入您的用户名:")
print(username, type(username))
# 请输入您的用户名:123
# 123 <class 'str'>

2.字符串格式化输出

2.1 %

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

# 以字典的形式传值,打破了位置限制
res3 = "my name is %(name)s my age is %(age)s" % {"age": 18, "name": "bobo"}
print(res3)

2.2 str.format 兼容性好,推荐使用

res4 = "你的名字是 {},你的年龄{}".format('jj', 19)
print(res4)  # 你的名字是 jj,你的年龄19

res5 = "你的名字是 {0}{0}{0},你的年龄{1}{1}".format('kk', 20)
print(res5)  # 你的名字是 kkkkkk,你的年龄2020

# 打破位置限制,按照key=value传值
res6 = "你的名字是 {name},你的年龄{age}".format(age=20, name="lala")
print(res6)  # 你的名字是 lala,你的年龄20

2.3 f python3.5以后才支持

x = "lalala"
y = 16
res7 = f"his name is {x},his age is {y}"
print(res7)  # his name is lalala,his age is 16

3.运算符(上)

1.数字运算符

print(10 + 3)  # 13
print(10 / 3)  # 3.3333333333333335 硬除,带小数
print(10 // 3)  # 3 保留整数部分(不是四舍五入)
print(10 % 3)  # 1 取模 取余数
print(10 ** 3)  # 1000 次方

2.比较运算符:>、<、>=、<=、==、!=

print(10 >= 3)  # True
print(10 == 3)  # False
print('a' == 'b')  # False
print('c' != 'd')  # True

3.赋值运算符

3.1变量赋值:=

3.2增量赋值:+=

age = 18
print(age)  # 18
age += 3
print(age)  # 21
age *= 3
print(age)  # 63
age /= 3
print(age)  # 21.0
age %= 3
print(age)  # 0.0
age **= 3
print(age)  # 0.0

3.3链式赋值

x = 10
y = x
z = y
print(x, y, z)  # 10 10 10
z = y = x = 11  # 链式赋值
print(x, y, z)  # 11 11 11

3.4交叉赋值

m = 10
n = 20
# 实现交换值功能
# 传统方法:
temp = m
m = n
n = temp
print('m:', m, 'n:', n)  # m: 20 n: 10
# 交叉赋值:
m, n = n, m
print('m:', m, 'n:', n)  # m: 10 n: 20

3.5解压赋值

l = [111, 222, 333, 444, 555]
# 一次将列表内的元素都取出来并批量赋值给变量
a, b, c, d, e = l  # 变量数与元素数一一对应,不可以多一个或者少一个
print(a, b, c, d, e)  # 111 222 333 444 555
# 解决办法,用*_进行占位
a, b, c, *_ = l#取前三个元素
print(a, b, c)#111 222 333
*_ ,a, b, c = l#取前三个元素
print(a, b, c)#333 444 555
a, *_ ,b, c  = l#取两边的元素
print(a, b, c)#111 444 555
#就是不能取中间的元素

#解压字典,默认解压出来的是字典的key
x,y,z=dic={'a':111,'b':222,'c':333}
print(x,y,z)#a b c

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值