【python】小学生都能学会!用python可视化模拟新冠疫情发展

【python】利用turtle库可视化模拟新冠疫情

关键词: python入门实践 少年编程教育 turtle 类与对象 新冠肺炎模拟

高阶班程序运行展示

在这里插入图片描述
随着模拟程序的运行,图中的点会逐渐由绿色变红,最终图中的点全部变为灰色,并不再移动。
点的颜色不同分别代表个体处于不同的健康状态:绿色为健康,黄色为潜伏期,红色为感染,而灰色则代表死亡。
计算机以绝对理性且冰冷的态度追随代码的运行让一个个点在无序运动逐渐变化颜色,但这却是2020年新冠肺炎爆发以来无数条因此丧生的鲜活生命。
愿疫情早日结束!

代码讲解

基础版:模拟新冠疫情爆发早期,新冠病毒刚开始出现

  1. 面向对象:设计人的类应有的方法和属性
    • 属性:
      • 健康状态 status,分为健康患病
      • 此时人们没有在意健康问题,都不戴口罩
    • 方法
      • __init__:定义对象的属性
      • move:人的随机运动
      • infect:健康人与患者距离小于50,则有50%的概率感染
  2. 画布尺寸:设置人员位置,活动范围
  3. 实现病毒的传播,即新冠肺炎可以由患者传染给健康的人

类的相关代码

如果对该程序兴趣,可以私聊我获取完整源码

# 相关类库的导入
import math
import random
import turtle
import time
import datetime

# 有关参数的定义
TOTAL_W = 500 #模拟场地总宽度
TOTAL_H = 400 #模拟场地总高度
DANGER_DIS = 50 #传染距离
RATE = 0.5  #传染率

class person(object):
    def __init__(self,status):
        self.turt = turtle.Turtle()
        self.turt.shape('circle')

        # 健康状态,1 为确诊 0 为健康
        self.status = status
        if self.status == 1:
            self.turt.color("red")
        else:
            self.turt.color("green")
        
        
        #随机定义该点的位置
        self.x = random.randint(-TOTAL_W*0.9,TOTAL_W*0.9)
        self.y = random.randint(-TOTAL_H*0.9,TOTAL_H*0.9)
        
        self.turt.penup()
        self.turt.goto(self.x,self.y)


    def move(self):
        dx = random.randint(-2, 2)
        dy = random.randint(-2, 2)
        if - TOTAL_W*0.9 < self.x + dx < TOTAL_W*0.9:
            self.x+=dx
        else:
            self.x-=dx
        if - TOTAL_W*0.9 < self.y + dy < TOTAL_W*0.9:
            self.y+=dx
        else:
            self.y-=dy
        #如果他们超出了边界就会往回走
        self.turt.penup()
        self.turt.goto(self.x, self.y)


    def infect(self,rate):
        x = random.randrange(0,100)
        # 根据传入的感染率的参数
        if x/100 < rate:
            self.status = 1 #此人被感染
            self.turt.color('red')
        
    def reset(self):
        self.turt.penup()
        self.turt.setpos(self.pos)

运行截图

基础版:绿色代表健康个体,红色为患病个体
基础版:绿色代表健康个体,红色为患病个体

进阶版:模拟新冠疫情爆发初期,民众防疫意识加强,开始佩戴口罩

  1. 面向对象:为人的类person添加新的方法和属性

    • 属性:

      • 类属性total_num:实验总人数

      • 类属性infected_num:感染人数

      • 实例属性 status,表示该对象的健康状态,分为健康患病

      • 实例属性 mask,表示该个体是否佩戴口罩,分为佩戴口罩不佩戴口罩

        此时人们开始关注新冠疫情,部分人开始佩戴口罩。
        佩戴口罩可以有效降低感染率(以下数据为主观猜测,未经验证和校对
        具体情况如下:

        患者是否佩戴口罩 健康人是否佩戴口罩 健康人的感染率
        佩戴 佩戴 1 %
        佩戴 不佩戴 15 %
        不佩戴 佩戴 30 %
        不佩戴 不佩戴 80 %
    • 方法

      • __init__:定义对象的属性
      • move:人的随机运动
      • infect:健康人与患者距离小于50,则有根据他们是否佩戴口罩,有不同的概率感
  2. turtle标题可以显示当前天数和感染人数

  3. 引入天数的概念

类的相关代码

如果对该程序兴趣,可以私聊我获取完整源码

# 相关类库的导入
import math
import random
import turtle
import time
import datetime

# 有关参数的定义
TOTAL_W = 500 #模拟场地总宽度
TOTAL_H = 400 #模拟场地总高度
DANGER_DIS = 50 #传染距离


class person(object):
    #类属性
    infected_num = 0
    total_num = 0
    def __init__(self,status,mask):
       	person.total_num += 1
        self.turt = turtle.Turtle()
        
        # 是否带口罩,1圆形 为戴口罩/0方形 为不戴口罩,
        self.mask = mask
        if self.mask == 1:
           self.turt.shape('circle')
        elif self.mask == 0:
           self.turt.shape('square')
        
        # 健康状态,1 为确诊/0 为健康
        self.status = status
        if self.status == 1:
            self.turt.color("red")
            self.infected_day = 0
            person.infected_num += 1
        else:
            self.turt.color("green")
        
        
        #随机定义该点的位置
        self.x = random.randint(-TOTAL_W*0.9,TOTAL_W*0.9)
        self.y = random.randint(-TOTAL_H*0.9,TOTAL_H*0.9)
        
        self.turt.penup()
        self.turt.goto(self.x,self.y)


    def move(self):
        dx = random.randint(-2, 2)
        dy = random.randint(-2, 2)
        if - TOTAL_W*0.9 < self.x + dx < TOTAL_W*0.9:
            self.x+=dx
        else:
            self.x-=dx
        if - TOTAL_W*0.9 < self.y + dy < TOTAL_W*0.9:
            self.y+=dx
        else:
            self.y-=dy
        #如果他们超出了边界就会往回走
        self.turt.penup()
        self.turt.goto(self.x, self.y)


    def infect(self,rate):
        x = random.randrange(0,100)
        if x/100 < rate:
            self.status = 1 #此人被感染
            self.infected_day = 0 #有了感染天数,且变为0
            self.turt.color('red')
            person.infected_num+=1 #感染人数+1

    def day(self):
        if self.status == 1:
            self.infected_day += 1
        

光理论是不够的,在此送大家一套2020最新Python全栈项目视频教程,点击此处 免费获取,希望大家一起进步哦!

运行截图

进阶版:方块为未佩戴口罩的个体,红色为佩戴口罩的个体
窗口标题显示当前天数感染人数总人数
进阶版:方块为未佩戴口罩的个体,红色为佩戴口罩的个体

高阶版:模拟新冠疫情爆发中期,人们逐渐了解肺炎的相关性质(潜伏、死亡等)

  1. 面向对象:引入潜伏期和患病天数的概念,引入死亡的概念

    • 属性:

      • 类属性total_num:实验总人数

      • 类属性infected_num:感染人数

      • 实例属性 status,表示该对象的健康状态,分为健康潜伏确诊

      • 实例属性 infected_day,表示患病天数,当患病天数大于4天后有一定概率由潜伏转变为确诊,大于7天有一定概率死亡

      • 实例属性 mask,表示该个体是否佩戴口罩,分为佩戴口罩不佩戴口罩

        此时人们开始关注新冠疫情,部分人开始佩戴口罩。
        佩戴口罩可以有效降低感染率(以下数据为主观猜测,未经查证
        具体情况如下:

        患者是否佩戴口罩 健康人是否佩戴口罩 健康人的感染率
        佩戴 佩戴 1 %
        佩戴 不佩戴 15 %
        不佩戴 佩戴 30 %
        不佩戴 不佩戴 80 %
    • 方法

      • __init__:定义对象的属性
      • move:人的随机运动,但是健康患者不会到隔离区,确诊患者只会在隔离区
      • infect:健康人与患者距离小于50,则有根据他们是否佩戴口罩,有不同的概率感染
      • day:如果这个人已患病,则调用这个函数其患病天数+1,当患病天数大于最短潜伏期后,一定概率转为确诊,大于最短死亡期后,一定概率死亡
  2. turtle标题可以显示当前天数、感染人数、死亡人数、总人数

类的相关代码

如果对该程序兴趣,可以私聊我获取完整源码

# 相关类库的导入
import math
import random
import turtle
import time
import datetime


class person(object):
    #类属性
    infected_num = 0
    total_num = 0
    dead_num = 0
    def __init__(self,status,mask):
       	person.total_num += 1
        self.turt = turtle.Turtle()
        
        # 是否带口罩,1为戴口罩 圆形/0为不戴口罩 方形
        self.mask = mask
        if self.mask == 1:
           self.turt.shape('circle')
        elif self.mask == 0:
           self.turt.shape('square')
        
        # 健康状态,2 为确诊 红色/1 为潜伏 黄色/0 为健康 绿色 
        self.status = status
        if self.status == 2:
            self.infected_day = 0
            person.infected_num += 1
            self.turt.color("red")
        elif self.status == 1:
            self.infected_day = 0
            person.infected_num += 1
            self.turt.color("yellow")
        else:
            self.turt.color("green")
        
        
        #随机定义该点的位置
        self.x = random.randint(-TOTAL_W*0.9,TOTAL_W*0.9)
        self.y = random.randint(-TOTAL_H*0.9,TOTAL_H*0.9)
        
        self.turt.penup()
        self.turt.goto(self.x,self.y)


    def move(self):
        dx = random.randint(-2, 2)
        dy = random.randint(-2, 2)
        if - TOTAL_W*0.9 < self.x + dx < TOTAL_W*0.9:
            self.x+=dx
        else:
            self.x-=dx
        if - TOTAL_W*0.9 < self.y + dy < TOTAL_W*0.9:
            self.y+=dx
        else:
            self.y-=dy
        #如果他们超出了边界就会往回走
        self.turt.penup()
        self.turt.goto(self.x, self.y)


    def infect(self,rate):
        x = random.randrange(0,100)
        if x/100 < rate:
            self.status = 1 #此人的状态进入潜伏期
            self.infected_day = 0 #有了感染天数,且变为0
            self.turt.color('yellow')
            person.infected_num+=1

    def day(self):
        if self.status > 0:
            if self.infected_day >= 7:
                x = random.randrange(0,100)
                if x/100 < DEATH_Rate: #死亡率为5%
                    #确定死亡时返回某个值
                    return -1
        if self.status == 1:
            self.infected_day += 1
            if self.infected_day >= 4:
                x = random.randrange(0,100)
                if x/100 < Diagnose_Rate:
                    self.status = 2
                    self.turt.color('red')
        return 0


    def dead(self):
        # 死亡以后颜色变为灰色
        self.turt.color('gray')
        person.total_num -= 1
        person.dead_num += 1
        if self.status>0:
            person.infected_num -= 1
    
    def __del__(self):
        person.total_num -= 1
        if self.status>0:
            person.infected_num -= 1

运行截图:
高阶版:黄色为潜伏期个体,灰色为死亡个体,不会再移动
窗口标题显示当前天数感染人数总人数
在这里插入图片描述


思路启发:

  • 治愈功能
  • 免疫功能
  • 隔离功能
  • 新冠肺炎和年龄相关,是否加入年龄的属性
  • 是否加入性别

注意问题:

  • python的turtle库进行模拟,因为极其耗费CPU,计算量太多了,有些功能不好实现,看下面的例子

【已经失败】最终版:模拟新冠疫情爆发后期,政府开始组织治疗、隔离

  1. 面向对象:引入隔离状态和免疫

    • 属性:

      • 类属性total_num:实验总人数

      • 类属性infected_num:感染人数

      • 类属性dead_num:死亡人数

      • 类属性isolated_num:隔离人数

      • 实例属性 status,表示该对象的健康状态,分为健康潜伏确诊免疫

        认为康复的人具备对新冠肺炎的抵抗力(仅为主观猜测,未查找相关资料求证

      • 实例属性 infected_day,表示患病天数,当患病天数大于4天后有一定概率由潜伏转变为确诊,大于7天有一定概率死亡

      • 实例属性isolated,表示该对象是否被隔离,一旦确诊立刻送往隔离

      • 实例属性 mask,表示该个体是否佩戴口罩,分为佩戴口罩不佩戴口罩

        此时人们开始关注新冠疫情,部分人开始佩戴口罩。
        佩戴口罩可以有效降低感染率(以下数据为主观猜测,未经验证和校对
        具体情况如下:

        患者是否佩戴口罩 健康人是否佩戴口罩 健康人的感染率
        佩戴 佩戴 1 %
        佩戴 不佩戴 15 %
        不佩戴 佩戴 30 %
        不佩戴 不佩戴 80 %
    • 方法

      • __init__:定义对象的属性,但是起始状态健康的人不会出现在隔离区
      • move:人的随机运动,但是健康患者不会到隔离区,确诊患者只会在隔离区内
      • infect:健康人与患者距离小于50,则有根据他们是否佩戴口罩,有不同的概率感染
      • day:如果这个人已患病,则调用这个函数其患病天数+1,当患病天数大于最短潜伏期后,一定概率(诊断率)转为确诊,大于最短死亡期后,一定概率(死亡率)死亡
      • isolated:如果此人确诊,则立即送往隔离区域
      • heal:对隔离区患者进行治疗,如果治疗成功则变为免疫状态
  2. 分配隔离区域为左上区域

  3. 编程失败,隔离功能没法写,CPU效率不够,会直接卡死


光理论是不够的,在此送大家一套2020最新Python全栈项目视频教程,点击此处 免费获取,希望大家一起进步哦!


如有帮助,欢迎点赞/转载~
(听说给文章点赞的人代码bug特别少👀)
联系邮箱:[email protected]
有问题欢迎通过邮箱交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章