第四章:用户交互、占位符与回收机制、可变类型与不可变类型
用户交互 input
-
待输入
-
你输入的内容赋值给了前面变量
-
input 出来的数据类型全部是 str
name = input('you name:')
age = input("you age:")
print('my name is {}, age is {}'.format(name, age))
print (name,age,type('age'))
# my name is ysg, age is 25
# ysg 25 <class 'str'>
格式化输出 print
占位符 %s %d
例子:print 、input
name = input('请输入姓名:')
age = input('请输入年龄:')
job = input('请输入工作:')
hobbie = input('你的爱好:')
msg = '''
------------ info of %s ------------
Name: %s
Age: %d
Job: %s
hobbie: %s
----------------end-----------------
'''%(name,name,int(age),job,hobbie)
print(msg)
# 输出
请输入姓名:ysg
请输入年龄:25
请输入工作:IT
你的爱好:射箭
------------ info of ysg ------------
Name: ysg
Age: 25
Job: IT
hobbie: 射箭
----------------end-----------------
- 括号内既可以放数据值也可以放变量名 并且支持多个 逗号隔开即可
- print自带换行符
换行符:\r\n \n(斜杠与字母组合到一起可能会产生特殊的含义) - print也可以切换结束符
print(数据,end='默认是\n')
format玩法
# format玩法1: 等价于占位符
res = 'my name is {} my age is {}'.format('jason', 123)
print(res)
# format玩法2: 索引取值并支持反复使用
res = 'my name is {0} my age is {1} {0} {0} {1}'.format('jason', 123)
print(res)
# format玩法3: 占位符见名知意
res = 'my name is {name1} my age is {age1} {name1} {age1} {name1} '.format(name1='jason', age1=123)
print(res)
# format玩法4: 推荐使用(******) Python 3.6 以上
name = input('username>>>:')
age = input('age>>>:')
res = f'my name is {name} my age is {age}'
垃圾回收机制
"""
有一些语言 内存空间的申请和释放都需要程序员自己写代码才可以完成
但是python却不需要 通过垃圾回收机制自动管理
"""
1.引用计数
name = 'jason' 数据值jason身上的引用计数为1
name1 = name 数据值jason身上的引用计数加一 为2
del name1 数据值jason身上的引用计数减一 为1
当数据值身上的引用计数为0的时候 就会被垃圾回收机制当做垃圾回收掉
当数据值身上的引用计数不为0的时候 永远不会被垃圾回收机制回收
2.标记清除
主要针对循环引用问题
l1 = [11, 22] # 引用计数为1
l2 = [33, 44] # 引用计数为1
l1.append(l2) # l1 = [11, 22, l2列表] 引用计数为2
l2.append(l1) # l2 = [33, 44, l1列表] 引用计数为2
del l1 # 断开变量名l1与列表的绑定关系 引用计数为1
del l2 # 断开变量名l2与列表的绑定关系 引用计数为1
当内存占用达到临界值的时候 程序会自动停止 然后扫描程序中所有的数据
并给只产生循环引用的数据打上标记 之后一次性清除
3.分代回收
python将内存根据对象的存活时间划分为不同的集合,每个集合称为一个代,python将内存分为了3“代”,分别为年轻代(0代)、中年代(1代)、老年代(2代),对应的是3个链表,它们的垃圾收集频率随着对象的存活时间的增大而减小。
垃圾回收机制的频繁运行也会损耗各项资源。
新生代、青春代、老年代(越往下检测频率越低)。
这种思想简单点说就是:对象存在时间越长,越可能不是垃圾,应该越少去收集。这样在执行标记-清除算法时可以有效减小遍历的对象数,从而提高垃圾回收的速度。
4.查看引用次数
import sys
print('l3的引用次数', sys.getrefcount([11, 22])) # 引用计数为 1
l3 = [11, 22]
print('l3的引用次数', sys.getrefcount(l3)) # 引用计数为 2
l3.append(l3)
print('l3的引用次数', sys.getrefcount(l3)) # 引用计数为 3
del l3
# NameError: name 'l3' is not defined
print('l3的引用次数', sys.getrefcount(l3))
可变类型与不可变类型
# 可变的:列表、集合、字典(可以进行更改,并且更改后物理地址不会发生改变)
# 不可变的:数字、字符串、元组(不可以进行更改,更改后就是一个新的对象了,物理地址发生了变化)
# 可变类型:值改变 内存地址不变
l1 = [11, 22, 33]
print(l1) # [11, 22, 33]
print(id(l1)) # 25787808
l1.append(44)
print(l1) # [11, 22, 33, 44]
print(id(l1)) # 25787808
# 不可变类型:值改变 内存地址肯定变
res = '$$hello world$$'
print(res) # $$hello world$$
print(id(res)) # 25691744
new_res = res.strip('$')
print(new_res) # hello world
print(id(new_res)) # 27237696