垃圾回收机制、流程控制、分支结构、循环结构

内容总结

  • 垃圾回收机制

    1、什么叫垃圾回收?

    ​ 在内存中没有任何变量名指向的数据

    2、针对垃圾数据在Python中有一套自动回收的方案

    1、引用计数

    ​ 内存中变量值身上有几个变量名绑定的引用计数就是几 只要不为0就不是垃圾

    user = '鸡哥'  # 数据值'鸡哥'身上的引用计数是1
    user1 = user   # 数据值'鸡哥'身上的引用计数+1 为2
    del user1	   # 数据值'鸡哥'身上的引用计数-1 为1
      '''
      当数据值身上的引用计数为0的时候 就会被垃圾回收机制当做垃圾回收掉
      当数据值身上的引用计数不为0的时候 永远不会被垃圾回收机制回收
      '''
    

    2、标记清除

    ​ 当内存即将沾满的时候 python会自动暂停程序的执行 从头到尾的将内存中数据进行扫描一遍 并打上标 之后再一次性清除掉标记的数据

    res1 = [11, 22]  # 数据值的引用计数为1
    res2 = [33, 44]  # 数据值的引用计数为1
    res1.append(res2)  # [11, 22, [33, 44]] 数据值引用计数为2
    res2.append(res1)  # [33, 44, [11, 22]] 数据值引用计数为2
    
    
    graph TB E(res1引用计数为1)-->|append+res2|res1数据值加了一个res2数据值-->|del res2减1|res1引用减1-->B(引用计数都是了1) A(res2引用计数为1)-->|append+res1|res2数据值加了一个res1数据值-->|del res1减1|res2引用减1-->B

    3、分代回收

    ​ 垃圾回收机制的频繁运行也会有损耗各项资源 会将数据的监管分为三个层次 随着层次的下降监管的频 率下降

新生成的变量名会被python解释器放到新生代里面每个隔1分钟在Python中就会检查一遍他们的引用计数 如果有变量名的引用计数增加的多 那么Python就会把变量名从新生代放到青春代 青春代每个10分钟检查一次 如果再有引用计数增加的更多的就会把它放到老年代 老年代每过30分钟检查一次
graph TB A(新年代)-->|逐步|B(青春代)-->|逐步|C(老年代)
  • 流程控制

    ​ 流程控制即控制事物的执行流程

    python中会使用代码的缩进来表示代码的从属关系

    分为三种结构

    ​ 1、顺序结构:自上而下依次运行

    ​ 2、分支结构:在运行过程根据条件的不同可能会执行不同的流程

    ​ 3、循环结构:在运行过程中有些代码需要反复执行

    必知必会

    ​ 1、条件都会转化成布尔值从而决定子代码是否执行

    ​ 2、在python中 使用缩进来表示代码的从属关系

    ​ 3、并不是所有代码都可以拥有子代码

    ​ 4、同属于某个代码的多行子代码 必须保持相同的缩进量 在python中通常使用4个空格来缩进

    PS:上一行代码的结尾如果是冒号 那么下一行代码必缩进

  • 分支结构

    1、单if分支结构

    if 条件:
    	条件成立之后执行的子代码
    # 如果年龄小于18 叫未成年
    eg:
        age = input('输入年龄')
        age = int(age)
        if age < 18:
            print('未成年')
    
    graph TB A(输入年龄)-->B(判断年龄是否小于18)-->是则输出未成年

    2、if与else连用

    if 条件:
    	条件成立执行的子代码
     else:
        条件不成立执行的子代码
    PS:if与else连用 两者的子代码永远知会执行一个
    # 如果年龄小于18 叫未成年 否则称成年人
    eg:
        age = input('输入年龄')
        age = int(age)
        if age < 18:
            print('未成年')
        else:
            print('成年人')
    
    graph TB A(输入年龄)-->B(判断年龄是否小于18)-->|小于18|则输出未成年 B-->|大于18|则输出成年人

    3、if elif else三者连用

    if 条件1:
    	条件1成立执行的子代码
    elif 条件2:
    	条件1不成立 条件2成立之后执行的子代码
    elif 条件3:
    	条件1和2都不成立 条件3 成立之后执行的子代码
    ...(elif可以有多个)
    else:
        上述条件都不成立执行的子代码
    PS:三者连用也只能执行其中一个子代码
    # 根据成绩评判分类 大于90优秀 大于80良好 大于60及格 其他挂科
    eg:
        age = input('请输入你的年龄>>>:')
        age = int(age)
        if age > 90:
            print('万万岁')
        elif age > 80:
            print('万岁')
        elif age > 70:
            print('千千岁')
        elif age > 60:
            print('千岁')
        else:
            print('百岁')
    
    graph TB A(输入年龄)-->B(判断年龄)-->|条件1成立|大于90则输出万万岁 B-->|条件1不成立执行条件2|大于80则输出万岁 B-->|条件1 2都不成立执行条件3|大于70则输出千千岁 B-->|条件1 2 3都不成立执行条件4|大于60则输出千岁 B-->|前面条件都不成立则执行|否则则输出百岁
    • 循环结构

      while循环

      while 条件:
      	条件成立之后循环的子代码
      1、先判断条件是否成立
      2、如果成立则执行循环替代码
      3、循环体代码执行完毕后再次回到条件判断处 判断条件是否成立
      4、如果条件成立 则继续执行循环体代码
      5、按照上述规律依次执行 直到条件不成立才会结束循环体代码的执行
      eg:
          count = 1
          while count <5 :
             print('我想打游戏')
             count += 1
      
      graph TB C(count=1时)-->A(条件判断小于5)-->B(则输出我想打游戏) B-.->|count+1|C

      while+break

      break  # 强行结束循环体代码
      	while循环体代码一旦执行到break会直接结束循环
      eg:
          while True:
              name = input('请输入你的名字>>>:')
              if name == 'jason':
                  print('你好')
                  break
              else:
                  print('滚')
      
      graph TB C(输入名字)-->A(条件判断是否等于jason)-->|是|B(break 结束) A-->|不是|D(打印滚) D-->C

      while+continue

      continue  # 直接跳到条件判断处
      当while循环体代码一旦执行到continue会结束本次循环 开始下一次循环
      eg:
          count = 1
      	while count < 11:
              print('count')
              count += 1
              if count == 4
              continue
      
      graph LR C(count=1)-->A(条件判断是否小于11)-->|小于4|打印count 打印count-->|+1|C A-->|等于4时|E(continue)-.->|跳过回到|A

      while+else

      while 条件:
      	循环体代码
      else:
      	循环体代码没有被强制结束的情况下 则执行完毕就会执行else子代码
      eg:
      	count = 1
          while count < 4:
              print('我想打游戏')
          else:
          	print('打个鸡毛')
      
      graph TB A(count=1)-->B(条件判断)-->|小与4|D(我想打游戏) D-.->|+1|A D-->|以上循环代码执行完|F(打个鸡毛)

练习

1、练习一

根据用户输入内容打印其权限
jason --> 超级管理员
tom --> 普通管理员
jack,rain --> 业务主管
其他 --> 普通用户

username = input('请输入你的名字>>>:')
if username == 'jason':
    print('超级管理员')
elif username == 'tom':
    print('普通管理员')
elif username == 'jack' or username == 'rain':
    print('普通用户')
else:
    print('普通用户')

2、练习二

编写用户登录程序
要求:有用户黑名单 如果用户名在黑名单内 则拒绝登录
eg:black_user_list = ['jason','kevin','tony']
如果用户名是黑名单以外的用户则允许登录(判断用户名和密码>>>:自定义)
eg: oscar 123
编写用户登录程序
用户如果登录失败 则只能尝试三次
用户如果登录成功 则直接结束程序

black_user_list = ['jason', 'kevin', 'tony']
# 1.获取用户输入的用户名、密码
count = 1  # 8.引入计数器
while count < 4:  # 10.条件判断是否小于4
    user = input('请输入你的用户名>>>:')
    pwd = input('请输入你的密码>>>:')
    if user not in black_user_list:  # 2.判断用户是不是在黑名单内
        if user == 'oscar' and pwd == '123':  # 4.判断输的用户名和密码是不是正确
            print('登入成功')  # 6.正确则输出成功
            break  # 7.结束循环
        else:
            print('用户名或密码输入错误')  # 5.错误则提示
    else:  # 3.是黑客的话拒绝访问
        print('拒绝访问')
    count += 1  # 每输错一次计数加1

3、练习三

假设用户的真实年龄是18 编写一个猜年龄的游戏 获取用户猜测的年龄
基本要求:可以无限制猜测 每次猜错给出提示(猜大了 猜小了) 猜对则结束程序
拔高练习:每次猜测只有三次机会 一旦用完则提示用户是否继续尝试 用户通过输入n或者y来表示是否继续尝试 如果是y则继续给用户三次猜测机会 否则结束程序

# 4.猜年龄游戏
real_age = 18
count = 0  # 11.引入计数
while True:  # 10.加入循环
    if count == 3:  # 12.判断猜测失败次数达到了3次
        index = input('是否继续输入y继续否侧退出>>>:')  # 14.获取用户输入是否还要继续运行
        if index == 'y':  # 15.判断用户输入y还要继续
            count = 0  # 17.则计数重新归0
        else:  # 18.否则输入其他则
            print('欢迎再来')
            break  # 结束退出
    else:  # 13.不然则
        guss_age = input('请输入你猜测的年龄>>>:')  # 1.获取猜测的年龄大小
        guss_age = int(guss_age)  # 2.转换成一样的数据类型
        if real_age > guss_age:  # 3.判断输的小于与真实年龄对比
            print('你猜的太小了')  # 4.输出
            count += 1
        elif real_age < guss_age:  # 6.判断输的大于真实年龄对比
            print('你猜的太大了')  # 7.输出
            count += 1
        else:  # 8.输入正确
            print('恭喜您猜对了')
            break  # 9.结束运行

posted @ 2022-09-27 20:33  小福福  阅读(555)  评论(0编辑  收藏  举报