python代码运行问题

#不知道为何 循环中出现为空,按照随机数产生,必有一一对应的关系

import random
from collections import deque

class Time():
    def __init__(self):
        self.minute=0
        self.hour=9

    def timechange(self):
        self.minute+=1
        if self.minute==60:
            self.minute=0
            self.hour+=1
     
    def timeend():
        print("营业结束")

class Guest():
    def __init__(self,a,hour,minute):
        self.business=chr(ord('A')+a%4)
        self.arrivehour=hour
        self.arriveminute=minute

class Counter():
    def __init__(self):
        self.free=True
        self.freetime=[None,None]
        self.servecount=0
        self.Acount=0
        self.Bcount=0
        self.Ccount=0
        self.Dcount=0

def pguest():
    rand=random.randint(1,53)
    if 0<rand<=4:
        return rand
    else:
        return None

def creatcounter():
    counter=[None,None,None,None]
    for i in range(4):
        counter[i]=Counter()
    return counter

def business(a):
    if a =='A':
        return '存款业务' 
    if a=='B':
        return '取款业务'
    if a=='C':
        return '挂失业务'
    if a=='D':
        return '还贷业务'

def showTicket(guest):
    global numb
    numb+=1
    hour=guest.arrivehour
    minute=guest.arriveminute
    str=business(guest.business)
    print("一位客户进入银行,取票时间为%2d时%2d分,编号%2d,业务为%s"%(hour,minute,numb,str))

def entercounter(time,counter,waitingqueue):
    for i in range(4):
        if counter[i].freetime[0]==time.hour and counter[i].freetime[1]==time.minute:
            counter[i].free=True
    if counter[0].free or counter[1].free or counter[2].free or counter[3].free:
        guest=waitingqueue.popleft()
        return guest

def choosecounter(counter,guest,time):
    timeh=time.hour
    timem=time.minute
    for i in range(0,4):
        if counter[i].free:
            counter[i].servecount+=1
            counter[i].free=False
            if guest.business=='A':
                counter[i].Acount+=1
                timem+=5
                if time.minute>60:
                    timeh+=1
                    timem-=60
            if guest.business=='B':
                counter[i].Bcount+=1
                timem+=5
                if time.minute>60:
                    timeh+=1
                    timem-=60
            if guest.business=='C':
                counter[i].Ccount+=1
                timem+=10
                if time.minute>60:
                    timeh+=1
                    timem-=60
            if guest.business=='D':
                counter[i].Dcount+=1
                timem+=10
                if time.minute>60:
                    timeh+=1
                    timem-=60
            counter[i].freetime[0]=timeh
            counter[i].freetime[1]=timem+1
    return [timeh-guest.arrivehour,timem-guest.arriveminute]

def average_time(b):
    t=len(b)
    totaltime=0
    for i in range(t):
        totaltime+=60*b[i][0]+b[i][1]
    return float(totaltime/t)


if __name__=='__main__':
    global numb
    numb=0
    time=Time()
    counter=creatcounter()
    waitingqueue=deque()
    staytime=[]
    while time.hour<17:
        new_guest=pguest()
        if new_guest:
            guest=Guest(new_guest,time.hour,time.minute)
            waitingqueue.append(guest)
            showTicket(guest)
            guest1=entercounter(time,counter,waitingqueue)
            b=choosecounter(counter,guest1,time)
            staytime.append(b)
            time.timechange()
        else:
            time.timechange()
    average=average_time(staytime)
    print('客户平均逗留时间为%0.1f分钟'%average)

在运行中,大概问题就是进入if条件后,guest莫名变为空类型,导致guest1变为空,choosecounter调用时报错

entercounter 并没有永远返回值啊,它只在 counter[0].free or counter[1].free or counter[2].free or counter[3].free 时返回,这个值为 False 的时候就不返回,guest1 就自然是 None 了呀:

def entercounter(time, counter, waitingqueue):
    for i in range(4):
        if counter[i].freetime[0] == time.hour and counter[i].freetime[1] == time.minute:
            counter[i].free = True
    if counter[0].free or counter[1].free or counter[2].free or counter[3].free:
        guest = waitingqueue.popleft()
        return guest

init 方法应该是 init ,这样才能被正确的调用。请修改以下代码:

class Time():
    def __init__(self):
        self.minute=0
        self.hour=9
        
    def timechange(self):
        self.minute+=1
        if self.minute==60:
            self.minute=0
            self.hour+=1

    def timeend(self):
        print("营业结束")

class Guest():
    def __init__(self,a,hour,minute):
        self.business=chr(ord('A')+a%4)
        self.arrivehour=hour
        self.arriveminute=minute

class Counter():
    def __init__(self):
        self.free=True
        self.freetime=[None,None]
        self.servecount=0
        self.Acount=0
        self.Bcount=0
        self.Ccount=0
        self.Dcount=0

def pguest():
    rand=random.randint(1,53)
    if 0<rand<=4:
        return rand
    else:
        return None

def creatcounter():
    counter=[None,None,None,None]
    for i in range(4):
        counter[i]=Counter()
    return counter

def business(a):
    if a =='A':
        return '存款业务'
    if a=='B':
        return '取款业务'
    if a=='C':
        return '挂失业务'
    if a=='D':
        return '还贷业务'

def showTicket(guest):
    global numb
    numb+=1
    hour=guest.arrivehour
    minute=guest.arriveminute
    str=business(guest.business)
    print("一位客户进入银行,取票时间为%2d时%2d分,编号%2d,业务为%s"%(hour,minute,numb,str))

def entercounter(time,counter,waitingqueue):
    for i in range(4):
        if counter[i].freetime[0]==time.hour and counter[i].freetime[1]==time.minute:
            counter[i].free=True
        if counter[0].free or counter[1].free or counter[2].free or counter[3].free:
            guest=waitingqueue.popleft()
            return guest

def choosecounter(counter,guest,time):
    timeh=time.hour
    timem=time.minute
    for i in range(0,4):
        if counter[i].free:
            counter[i].servecount+=1
            counter[i].free=False
            if guest.business=='A':
                counter[i].Acount+=1
                timem+=5
                if timem>60:
                    timeh+=1
                    timem-=60
            if guest.business=='B':
                counter[i].Bcount+=1
                timem+=5
                if timem>60:
                    timeh+=1
                    timem-=60
            if guest.business=='C':
                counter[i].Ccount+=1
                timem+=10
                if timem>60:
                    timeh+=1
                    timem-=60
            if guest.business=='D':
                counter[i].Dcount+=1
                timem+=10
                if timem>60:
                    timeh+=1
                    timem-=60
            counter[i].freetime[0]=timeh
            counter[i].freetime[1]=timem+1
            return [timeh-guest.arrivehour,timem-guest.arriveminute]

def average_time(b):
    t=len(b)
    totaltime=0
    for i in range(t):
        totaltime+=60*b[i][0]+b[i][1]
    return float(totaltime/t)

if __name__=='__main__':
    global numb
    numb=0
    time=Time()
    counter=creatcounter()
    waitingqueue=deque()
    staytime=[]
    while time.hour<17:
        new_guest=pguest()
        if new_guest:
            guest=Guest(new_guest,time.hour,time.minute)
            waitingqueue.append(guest)
            showTicket(guest)
            guest1=entercounter(time,counter,waitingqueue)
            b=choosecounter(counter,guest1,time)
            staytime.append(b)
        time.timechange()
    else:
        time.timeend()
    average=average_time(staytime)
    print('客户平均逗留时间为%0.1f分钟'%average)