#不知道为何 循环中出现为空,按照随机数产生,必有一一对应的关系
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)