Classe de file d'attente, retirer et mettre en file d'attente ? python
J'ai donc cette question et il est dit de créer une classe file d'attente et de faire de la méthode retirer et à mettre en file d'attente
Voici ce que j'ai jusqu'à présent, quelqu'un pourrait-il me diriger sur la bonne voie?
class queue:
def __init__(self,queue):
self.queue = []
def dequeue(self):
if len(queue) > 0:
e = queue[0]
queue = list[1:len(queue)]
else:
return "There are no elements to remove"
def enqueue(self,element):
queue.insert([-1], element)
Utilisation
Bien que ce ne sera pas vous aider si c'est pour un devoir en classe, si vous souhaitez utiliser une file d'attente de la structure de données à l'avenir, vous devriez toujours utiliser les
self.queue
lorsque l'on se réfère à ce membre - par exemple e = queue[0]
devrait être e = self.queue[0]
Bien que ce ne sera pas vous aider si c'est pour un devoir en classe, si vous souhaitez utiliser une file d'attente de la structure de données à l'avenir, vous devriez toujours utiliser les
collections.deque
plutôt que d'écrire votre propre. Il est implémenté en C (et donc très rapide) et a eu des années de tests (si vous avez peu de chances de tomber sur des bugs).OriginalL'auteur user2928929 | 2013-12-13
Vous devez vous connecter pour publier un commentaire.
Il y a quelques problèmes ici.
queue
par lui-même renvoie à votre classe, pas à l'instance de l'attribut avec le même nom, qui estself.queue
. Vous devez utiliser leself.
tout le temps. Et il serait vraiment aider à donner à la classe et de son attribut des noms différents, afin d'éviter cette confusion. (Il serait également aider à l'utilisation de la PEP 8 style et le nom de la classeQueue
.)e
, mais vous n'avez jamaisreturn
; vous venez de tomber de la fin de la fonction, ce qui signifie que vous revenez automatiquementNone
.list[1:len(queue)]
est d'essayer de trancher le typelist
, pas de votre liste actuelle (self.queue
). Ce que tu voulais estself.queue[1:len(queue)]
.__init__
prend un argument qu'il n'utilise jamais. Vous avez sans doute voulu l'utiliser comme valeur de départ pour la file d'attente de contenu. Et vous avez sans doute aussi envie de la rendre facultative.list.insert
fonction ne prend paslist
comme[-1]
pour son premier argument, il faut un indice comme-1
.Plus, il y a quelques choses qui pourraient être plus simple:
self.queue[1:]
, au lieu d'utiliserlen(self.queue)
.pop(0)
.append
.if the_list
, pasif len(the_list) > 0
. Vide collections sont toujours falsey et non-vide collections de la vérité.pop
va lever une exception, ce qui est exactement ce que tu voulais faire.Donc:
Si vous souhaitez personnaliser l'exception, donc il est dit, par exemple,
IndexError: dequeue from empty Queue
au lieu deIndexError: pop from empty list
, vous pouvez le faire avec untry
déclaration:Si vous voulez tester votre classe de file d'attente fonctionne correctement, vous aurez besoin d'écrire des fonctions de test, puis de les appeler. Par exemple:
Maintenant, il vous suffit d'exécuter le script, et il va exécuter vos tests.
Dans la vraie vie, vous aurez envie de penser à d'autres tests complets qui couvrent l'ensemble de l'étrange cas de bord que vous pouvez penser. Et vous voudrez probablement utiliser la
unittest
bibliothèque ou à un tiers solution commenez
d'organiser et de simplifier vos tests.Eh bien, vous avez besoin d'écrire une sorte de fonction une file d'attente et l'appel de cette fonction. Je peux ajouter un exemple de la réponse.
OriginalL'auteur abarnert
Utilisation de l'auto.la file d'attente, sinon vous obtiendrez une erreur
vous n'avez pas de retour de l'élément lors de l'auto.la file d'attente n'est pas vide
Et vous feriez mieux de ne pas renvoyer un message lorsque la file d'attente est vide, faut juste lever exception
OriginalL'auteur PasteBT