Python队列 - 打印
代码:
1 from pythonds.basic.queue import Queue 2 import random 3 4 class Printer: # 不需要def 5 def __init__(self, ppm): # 也就是初始化这个打印机的时候,你得告诉打印机每分钟能打印多少页 6 self.pagerate = ppm # 每分钟打印多少面 7 self.currentTask = None 8 self.timeRemaing = 0 9 10 def busy(self): # 除了初始函数,其他不需要加两个斜杠 11 return self.currentTask != None 12 13 def tick(self): # 每一个内置函数,一般都需要传入属于这个类的内置函数 14 if self.timeRemaing != 0: 15 self.timeRemaing = self.timeRemaing - 1 16 if self.timeRemaing <= 0: 17 self.currentTask = None 18 19 def startNewTask(self, newtask): 20 self.currentTask = newtask 21 self.timeRemaing = newtask.getPages()*60/self.pagerate # 注意这里是每分钟打印多少张 22 23 class Task: 24 def __init__(self, time): 25 self.pages = random.randrange(1, 21) 26 self.timeStamp = time 27 28 def getStamp(self): 29 return self.timeStamp 30 31 def getPages(self): 32 return self.pages 33 34 def waitTime(self, currentTime): 35 return currentTime - self.timeStamp 36 37 38 def getNewTask(): 39 num = random.randrange(1, 181) 40 return num == 7 41 42 def simulation(time, model): 43 printer0 = Printer(model) 44 taskQueue = Queue() 45 waitingTimes = [] 46 for currentTime in range(time): 47 if getNewTask(): 48 task = Task(currentTime) 49 taskQueue.enqueue(task) # 可能有多个任务在等待 50 51 if (not printer0.busy()) and (not taskQueue.isEmpty()): 52 task1 = taskQueue.dequeue() 53 printer0.startNewTask(task1) 54 waitingTimes.append(task1.waitTime(currentTime)) # 核心,我们想得到的是每个任务等待时间,而不是每个任务的工作时间 55 56 printer0.tick() # 没有任务也可以写这行代码,类的声明里已经解决了 57 averageWaitTime = sum(waitingTimes) / len(waitingTimes) 58 print("Average Waiting time is %6.2f secs, %3d tasks remaining." \ 59 % (averageWaitTime, tq.size())) 60 61 for i in range(7): 62 simulation(3600, 10)
关于类的体会:
1.声明类不用def, class即可
2.每个类一般都要有初始化函数,def __init__(self, 其他参数):,而类的其他函数不需要__ __init__
3.类的初始化变量十分重要,类里的其他函数往往都会用到这些,为了区分开,所以类的函数需要传入self参数,表示函数利用的变量是类自身的
4.获取每类对象的参数,对每类对象进行一类操作