【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]
有問題歡迎通過郵箱交流。

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