垃圾回收以及流程控制

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
    #  当内存占用到达临界值的时候,程序会自动停止,然后扫描程序中所有的数据,并给只产生循环引用的数据打上标记,之后一次性清除
    
    

标记清除-原理图

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

  • 流程控制理论

  1. 在编程的世界中下列三者会出现混合使用

  2. Python代码中建议使用空格表示代码的从属关系,建议使用4个空格

    从属关系:缩进的代码(子代码)是否执行取决于上层代码,并不是所有的代码都有子代码

  3. 如果多行子代码同属于一个父代码,那么这些子代码需要保持相同的缩进

  4. 当一行代码需要编写子代码时,必须以冒号结尾

  5. 相同缩进的代码之前平起平坐,按照顺序结构依次进行

  • 流程控制理论是是所有编程语言中最重要的一环,代表着代码逻辑处理

  • 流程控制分为

    • 顺序结构
      按照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


posted @ 2025-03-13 11:28  樵夫-  阅读(14)  评论(0)    收藏  举报