第四章:用户交互、占位符与回收机制、可变类型与不可变类型

用户交互 input

  1. 待输入

  2. 你输入的内容赋值给了前面变量

  3. 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-----------------
  1. 括号内既可以放数据值也可以放变量名 并且支持多个 逗号隔开即可
  2. print自带换行符
    换行符:\r\n \n(斜杠与字母组合到一起可能会产生特殊的含义)
  3. 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
posted @ 2022-10-04 17:58  亦双弓  阅读(37)  评论(0)    收藏  举报