垃圾回收机制详解、运算符和格式化输出
目录
一、垃圾回收机制的原理
当我们定义变量的时候,会申请一块内存空间用来存放变量值,然后利用赋值符号将变量名和变量值绑定在一起,接下来我们在使用变量值得时候就可以通过变量名来找到那块内存空间了。
1 垃圾回收的原则
引用一般分为直接引用和间接引用。无论是直接引用还是间接引用,当变量值的被引用次数变为o的时候,就会被看做垃圾被系统的垃圾回收机制回收。
1.1 直接引用
我们直接进行将变量名与变量值绑定关系就被称为直接引用。一个变量值可以被引用很多次。
# 下面的变量都是直接引用
my_love = "美女"
your_love = "护士"
he_love = your_love
1.2 间接引用
当变量值被容器性质的数据类型引用的时候,就是属于间接引用。
your_love = "护士"
# 下方列表的引用属于间接引用
my_loves = ["空姐",your_love]
1.3 标记清除
l1 = [1,2]
l2 = [3,4]
# 两个列表互相引用
l1.append(l2)
l2.append(l1)
# 删除两个列表
del l1
del l2
上面两个列表变量名在被我们删除以后,变量值互相引用,所以引用次数为1,但是我们却不需要这一块变量值了,这个时候,就用到标记清除了,首先我们要知道,变量名和变量值不在一块空间。
解释器每隔一段时间扫描一下变量名,然后顺着变量名的绑定关系将变量值进行标记,在全部扫描之后,凡是被顺藤摸瓜的变量值都会存活,而其他未标记的则会被删除
1.4分代回收
如果解释器抑制不同的扫描会加大内存负担,所以Python内部将变量名分根据权重三个部分,。
- 新生代。扫描频率较高,在几次扫描之后依然存在会被送到下一级。
- 青春代。扫描频率减少,在几次扫描之后依然存在会被送到下一级。
- 老年代。扫描频率继续减少,已经是位高权重的大佬了。
二、运算符
运算符分为算术运算符、比较运算符、赋值运算符、解压运算符、逻辑运算符、身份运算符、成员运算符。
2.1 算术运算符
算术运算符就是进行数学运算。
# 加法
print(10+10)
# 减法
print(10-10)
# 乘法
print(10*10)
# 除法
print(10/10)
# 取整
print(10//10)
# 取余
print(10%10)
2.2 比较运算符
比较运算符 | 意义 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
!= | 不等于 |
== | 等于 |
2.3 赋值运算符
复制运算符就是使用等于号 =。有以下几个骚套路。
# 赋值
a = 90
# 增量赋值.
a += 1 # a = a + 1
a -=1 # a = a - 1
a *=1 # a = a * 1
a /=1 # a = a / 1
# 链式赋值
x = q = 12
# 交叉赋值
w = 12
e = 34
w, e = 34, 12
print(w,e)
# 解压赋值
# 注意,一般都使用 *_ 来匹配不用的变量,约定俗成。
l1 = [1,2,3,4,5]
a, b, c,d ,e = l1[:] # 逐个赋值
*_,e = l1 # 只取末尾赋值
2.4 逻辑运算符
逻辑运算符 | 意义 |
---|---|
not | 对条件的布尔值取反 |
and | 两边的条件都为真则返回真,否则为假 |
or | 两边的条件都为假则返回假,否则为真 |
逻辑运算符有优先级的顺序:not >and>or。
# 这两个列式的执行效果是一样的。
1>2 and 2!=3 or not 4>3 and 7<5
((1>2 and 2!=3) or ((not 4>3) and 7<5))
不建议在写程序的时候用到这么多的运算符。会被骂娘的。
短路运算(偷懒原则)
- 当条件是一系列同样地and的时候,只要一个条件为假,就不计算后面的条件。
- 当条件是一系列的or 的时候,只要一个条件为真,就不计算后面的条件。
2.5 成员运算符
运算符 | 意义 |
---|---|
in | 判断该元素是否在一个容器型的数据类型中 |
not in | 判断该元素是否不在一个容器型的数据类型中 |
2.6 身份运算符
运算符 | 意义 |
---|---|
is | 判断是不是同一个id |
三、格式化输出
格式化输出已拥有三种方式。
3.1 % 占位符
利用% 来当占位符已经是计算机的传统了。
name = "Tom"
age = 18
# %s 可以接受任何数据类型。
# 按照顺序赋值,必须一一对应。
print("%s is %s." %(name,age) )
# 按照字典的顺序赋值
print("%(name)s is %(age)s." % {"name": "tom","age": 18})
3.2 str.format()
是字符串的一种方法,括号内可以穿进去参数。推荐使用这个方法。
name = "Tom"
age = 18
# 按照位置传值
print("{} is{}".format(name,age))
# 按照索引传值
print("{1} is {0}".format(age,name))
# 按照字典传值
print("{name} is {age}".format(name="tom",age=18))
3.3 f""
这个版本是3.5版本之后出现的方法
my_name = "tom"
your_name = "jerry"
res = f"我的名字是{my_name},你的名字是{your_name}"
print(res)
tips:作业
'''1、
用户输入姓名、年龄、工作、爱好 ,然后打印成以下格式
------------ info of Egon -----------
Name : Egon
Age : 22
Sex : male
Job : Teacher
------------- end -----------------
'''
print("请输入您的信息。")
name = input("Name:").strip()
age = input("Age:").strip()
sex = input("Sex:").strip()
job = input("Job:").strip()
print('''
--------------info of %s ---------------
Name : %s
Age : %s
Sex : %s
Job : %s
------------- end -----------------
'''%(name.title(),name.title(),age,sex,job))
# 2、用户输入账号密码,程序分别单独判断账号与密码是否正确,正确输出True,错误输出False即可
user_info = {"tom": "123"}
name = input("user name:").strip()
pwd = input("user pwd:").strip()
if name in user_info:
if pwd == user_info["name"]:
print("True")
else:
print("False")
else:
print("Wrong name or password.")
# 3、让计算机提前记下egon的年龄为18岁,写一个才年龄的程序,要求用户输入所猜的年龄
# ,然后程序拿到用户输入的年龄与egon的年龄比较,输出比较结果即可
age = 18
print("让我们猜一下egon老师的年龄吧")
guess_num = input("请输入你猜的年龄:").strip()
if guess_num.isdigit():
if age > int(guess_num):
print("兄弟,你猜小了。")
elif age < int(guess_num):
print("兄弟,你猜大了。")
else:
print("bingo.....")
'''4、程序从数据库中取出来10000条数据,打算显示到页面中,
但一个页面最多显示30条数据,请选取合适的算数运算符,计算
显示满30条数据的页面总共有多少个?
最后一页显示几条数据?
'''
full_page = 10000//30
last_page = 10000%30
print("显示满30条数据的页面总共有%s个" % full_page)
print("最后一页显示%s个数据" % last_page)
# 5、egon今年为18岁,请用增量赋值计算3年后egon老师的年龄
egon_age = 18
egon_age += 3
# 6、将值10一次性赋值给变量名x、y、z
x = y = z = 10
# 7、请将下面的值关联到它应该对应的变量名上,你懂的
dsb = "egon"
superman = "alex"
dsb, superman = "alex", "egon"
# 8、我们只需要将列表中的傻逼解压出来,一次性赋值给对应的变量名即可
names=['alex_sb','wusir_sb','oldboy_sb','egon_nb','lxx_nb','tank_nb']
alex, wusir, oldboy = names[:2]
"""
选做题:
编写用户登录接口(学的多的同学,尝试做下述作业,这是截止到下周二学完文件处理之后的作业)
#1、输入账号密码完成验证,验证通过后输出"登录成功"
#2、可以登录不同的用户
#3、同一账号输错三次锁定(附加功能,在程序一直运行的情况下,一旦锁定,则锁定5分钟后自动解锁)
#扩展需求:在3的基础上,完成用户一旦锁定,无论程序是否关闭,都锁定5分钟
"""
import time
user_info = {"tom": "123",
"jerry": "111"
}
count = 0
while count < 3:
username = input("user name:").strip()
pwd = input("user pwd:").strip()
if (username in user_info) and (pwd == user_info[username]):
print("Welcome...")
break
else:
print("Wrong name or password.")
count += 1
if count == 3:
time.sleep(300)
count = 0