垃圾回收以及流程控制
Python垃圾回收以及流程控制
-
垃圾回收
-
流程控制理论
-
流程控制之分支结构
-
流程控制之循环结构
垃圾回收机制
在不分语言中,内存空间的申请和释放都需要程序员自己写代码才可以完成,但是Python这里不需要,有自身的垃圾回收机制自动管理
- 引用计数
引用计数,每一个变量值都有对应的计数值,每增加一个变量的引用,计数值则会加一,每减少一个引用计数值则会减一,
当引用值等于0时,就会触发垃圾回收机制
引用计数-原理图

- 标记清除
标记清除主要针对循环引用的问题# 代码实例 l1 = [11, 22] # 引用计数1 l2 = [33, 44] # 引用计数1 # 循环引用 l1.append(l2) # l1 = [11, 22, [33, 44]] # 引用值为2 l2.append(l1) # l2 = [33, 44, [11, 22]] # 引用值为2 del l1 # 断开变量名l1与列表的绑定关系,引用值变更为1 del l2 # 断开变量名l2与列表的绑定关系,引用值变更为1 # 当内存占用到达临界值的时候,程序会自动停止,然后扫描程序中所有的数据,并给只产生循环引用的数据打上标记,之后一次性清除
标记清除-原理图

- 分代回收
用的越久的对象,被回收的可能性越小
请直接看原理图
分代原理图

-
流程控制理论
在编程的世界中下列三者会出现混合使用
Python代码中建议使用空格表示代码的从属关系,建议使用4个空格
从属关系:缩进的代码(子代码)是否执行取决于上层代码,并不是所有的代码都有子代码
如果多行子代码同属于一个父代码,那么这些子代码需要保持相同的缩进
当一行代码需要编写子代码时,必须以冒号结尾
相同缩进的代码之前平起平坐,按照顺序结构依次进行
-
流程控制理论是是所有编程语言中最重要的一环,代表着代码逻辑处理
-
流程控制分为
-
顺序结构
按照python代码的执行顺序,从上到下的执行
顺序结构流程图
-
分支结构
根据逻辑处理的不同条件执行不同分支的代码体
分支结构流程图
-
循环结构
事务会更具循环条件重复执行
循环结构流程图

-
以上是流程控制的3个原理,接下来看如何使用代码的方式实现
- 分支结构 关键字为(if elif else)
if 条件1:
条件成立之后执行的代码体
elif:条件2
条件1不成立执行的代码体
else:
条件1和2都不成立执行的代码体
# ps:elif可以有很多个,但是只会执行一个
- 单分支结构
# 单分支流程控制
name = input('请输入你的姓名>>:')
if name == 'wesley':
print('欢迎:%s' % name)
- 多分支结构
# 多分支结构
# 多分支流程控制
name = input('请输入你的姓名>>:')
if name == 'wesley':
print('欢迎admin: %s' % name)
elif name == 'laowang':
print('欢迎admin: %s' % name)
else:
print('admin效验失败')
- 嵌套使用
# if的嵌套使用
info = { 'classroomA':'A教', 'classroomB':'B教', 'floorA':'A栋','floorB':'B栋' }
info_1 = input('请告诉我wesley在不在A栋还是B栋,请输入[Y/N]:')
print('喊一下wesley下楼吃饭')
# 确认welsey在园区内A栋还是B栋
if info_1 == 'Y':
print('好的我去A栋找一下他')
# 去A栋找
if 'floorA' in info:
print('去教室找一下吧')
if 'classroomA' in info:
print('原来你在A教,下去吃饭吧')
elif 'classroomB' in info:
print('原来你在B教,下去吃饭吧')
else:
print('可能是在B栋')
else:
print('可能在B栋那边,我们先去吃饭吧')
elif info_1 == 'N':
print('好吧,B栋太远了,我们先去吃饭')
- 循环结构
定义:满足条件的情况下,代码一直运行,关键字while
使用:''' while 条件 条件成立之后执行的子代码(循环体代码) 1.先判断条件是否成立 2.如果成立则执行循环体代码 3.循环体代码执行完毕后再次回到条件判断处 判断条件是否成立 4.如果成立 则继续执行循环体代码 5.按照上述规律依次执行 直到条件不成立才会结束循环体代码的执行 关键字 break # 强行结束循环体 while循环体代码一旦执行到break会直接结束循环 continue # 直接跳到条件判断处 while循环体代码一旦执行到continue会结束本次循环 开始下一次循环 '''
# 代码实例
# 打印1-10
num = 0
while num < 11:
print(num)
num += 1
# 使用break关键字,打印数字5的时候强行跳出
num = 0
while num < 11:
print(num)
num += 1
if num == 6:
break
# 使用continue 不打印数字4
num = 0
while num < 10:
num += 1
if num == 4:
continue
else:
print(num)
-
while 循环补充说明
-
流程控制之for循环
-
while循环之死循环
- 真正的死循环一旦执行,cpu功耗会急剧上升
# 死循环 while True: i = 99 ** 99 print(i) -
while嵌套及全局标志位
- 注意: 一个break只能结束它所在的那一乘循环
- 注意:有几个while的嵌套,如果想一次性结束就应该写几个break
- 注意:如果不想反复的写break,可以使用全局标志位,就是在循环开始之初,定义一个变量为True,如果需要跳出while循环把这个变量赋值为False即可
is_flag = True # 这里定义一个全局标志位 while is_flag: # while的条件是如果is_flag = True就运行False就不运行 username = input('username>>>:') password = input('password>>>:') if username == 'jason' and password == '123': while is_flag: # 判断is_flag cmd = input('请输入您的指令>>>:') if cmd == 'q': # 这里判断我们输入的命令是什么,如果为q 直接将is_flag 从新赋值为False is_flag = False print('正在执行您的指令:%s' % cmd) else: print('用户名或密码错误') -
流程控制之for循环
- for循环和while循环一样,都可以做到同样的事情,但是for循环的写法会比while的写法简单
- 命名: 一般如果没有特定含义的数据可以使用,i,j,k,v,item 命名
- 特点:擅长遍历取值,不需要结束条件,自动结束
- 应用场景: 遍历对象的数据值
- 语法:
for 循环变量 in 被循环的对象: print(循环变量) ```python # 代码实例 name = [ 'jinke', 'wesley', 'kimi' ] for i in name: print(i) jinke wesley kimi # 如果使用while写则为下列这样 name = [ 'jinke', 'wesley', 'kimi' ] count = 0 while count < 3: print(name[count]) count += 1
在使用for遍历数据时需要注意,每种不同的数据类型,取值的样式都是不一样的,下列为代码实例
# for 循环主要遍历的数据类型常见的有(字符串,列表,元组,字典,集合,整型)
# for循环之字符串循环
info = 'Hello world'
for i in info:
print(i)
"""
输出结果
H # 这里看到这里是按照数据类型的最小单位打印的,字符串就是单个字符
e
l
l
o
# 这里是空格,也算是字符串的单个字符
w
o
r
l
d
"""
# 这里需要比较注意的是字典,和取值的方式是一样的,只答应key
user_id = {'username': 'wesley', 'password': 123}
for i in user_id:
print(i)
"""
# 输出结果
username
password
"""
-
基本数据类型方法
之前说了很多的数据类型,那针对这些数据方法就会有很多关于数据操作的方法
- range()方法
# 定义: range方法可以理解为帮我们生产一个内部包含多个数字的数据
# 默认起始位置为0 终止位置为100,python默认左开右闭
for i in range(101):
# [0..100]
print(i)
# 第一个是起始位置,第二个是终止位置
for i in range(10, 20):
print(i)
# 第三个个数为等差值,也叫做步长,默认不写为1
for i in range(1, 20, 2)
print(i)
Python2 和Python3 的差别
"""
在python2中
range()
直接产生一个列表 内部含有多个数值
xrange()
其实就是python3里面的range
在python3中
range()
类似于一个工厂 不会占用太多的内存空间 要就生产
"""
练习题
"""
1.根据用户输入内容打印其权限
'''
jason --> 超级管理员
tom --> 普通管理员
jack,rain --> 业务主管
其他 --> 普通用户
'''
"""
# 答案
user = input('请输入用户名>>:')
if user == 'jason':
print('欢迎超级管理员:%s' % user)
elif user == 'tom':
print('欢迎管理员:%s' % user)
elif user == 'jack' or 'rain':
print('欢迎业务主管:%s' % user)
else:
print('欢迎普通用户: %s' % user)
"""
2.编写用户登录程序
要求:有用户黑名单 如果用户名在黑名单内 则拒绝登录
eg:black_user_list = ['jason','kevin','tony']
如果用户名是黑名单以外的用户则允许登录(判断用户名和密码>>>:自定义)
eg: oscar 123
"""
black_user_list = ['jason','kevin','tony']
user = ['li', 'liu']
password = ['2131231', '123']
info = input('请输入用户名:')
if info in black_user_list:
print('老铁你被封号了')
elif info in user:
passs = input('请输入密码:')
if info == user[0] and passs == password[0]:
print('欢迎用户:%s' % info)
elif info == user[1] and passs == password[1]:
print('欢迎用户:%s' % info)
else:
print('账号或密码错误')
"""
3.编写用户登录程序
用户如果登录失败 则只能尝试三次
用户如果登录成功 则直接结束程序
"""
# 答案
user = ['li']
passs = ['666']
num = 0
info_user = input('请输入用户名:')
# 判断用户
if info_user in user[0]:
info_pass = input('请输入密码:')
while num < 3:
if info_pass in passs[0]:
print('登录成功')
break
elif num < 3:
info_pass = input('密码输入错误,请从新输入:')
num += 1
continue
else:
print('没有机会了')
# 4.猜年龄的游戏
# 假设用户的真实年龄是18 编写一个猜年龄的游戏 获取用户猜测的年龄
# 基本要求:可以无限制猜测 每次猜错给出提示(猜大了 猜小了) 猜对则结束程序
# 拔高练习:每次猜测只有三次机会 一旦用完则提示用户是否继续尝试 用户通过输入n或者y来表示是否继续尝试 如果是y则继续给用户三次猜测机会 否则结束程序
num = 0
is_True = ['Y']
age = int(input('请输入你先猜测的年纪:'))
while True:
if num < 2:
if age == 18:
print('恭喜你,猜对了')
break
elif age < 18:
print('猜错了哦,猜小了哦')
num += 1
age = int(input('请输入你先猜测的年纪:'))
elif age > 18:
print('猜错了哦,猜大了哦')
num += 1
age = int(input('请输入你先猜测的年纪:'))
else:
is_True = input('还要重新猜吗,请输入[Y/N]: ')
if is_True in ['Y']:
num = 0
age = int(input('请输入你先猜测的年纪:'))
continue
elif is_True in 'N':
print("结束")
break

浙公网安备 33010602011771号