2017-10-18 13 views
-1

Salut je liste de quatre directions et la méthode commePyCharm debuger disconects

directions = ["NORTH", "EAST", "SOUTH", "WEST"] 
def rotate_left(self): 
    cycled = cycle(self.directions) 
    current = dropwhile(lambda x: x != self.direction, cycled) 
    self.direction = next(current) 

mais en quelque sorte après cette méthode mon programme arrête sans exception

toute idée pourquoi? Merci

+0

Écrivez un exemple complet qui reproduit votre problème –

+0

J'appelle juste cette méthode et il semble que les cycles de processus à la dernière déclaration – PapeK24

+0

Comment appelez-vous 'rotate_left'? – Wondercricket

Répondre

0

Il semble que problème était que dropwhile() état ne pourrait jamais se réaliser dans mon code. En raison de l'exécution paresseuse des pythons, il semblait que le problème était avec moi appelant next(), mais c'était seulement parce que c'était quand dropwhile() exécuté, l'obligeant à faire défiler List sans fin sans jamais terminer la condition.

Désolé pour perdre votre temps tout le monde.

2

j'ai pu répéter la description de votre problème avec le code suivant

from itertools import cycle, dropwhile 

direction = None 
directions = ["NORTH", "EAST", "SOUTH", "WEST"] 
cycled = cycle(directions) 
current = dropwhile(lambda x: x != direction, cycled) 
direction = next(current) 

Il est difficile de dire sans le reste de votre code, mais par les regards de la valeur initiale de direction ne n'existe pas dans la liste directions; ce qui signifie qu'il n'est ni NORTH, SOUTH, EAST, ou WEST (sensible à la casse). Cela provoque une itération infinie entre cycle et dropwhile

Si vous lisez la documentation itertools, dropwhile

Faire un itérateur qui laisse tomber des éléments de la itérables tant que le prédicat est vrai; après, retourne tous les éléments

Tout d'abord, étant donné dropwhile gouttes éléments aussi longtemps que le prédicat est vrai, il va enfin arrêter une fois qu'il est atteint une valeur fausse, puis retourner l'élément restant. En second lieu, l'utilisation de cycle génère une répétition iterator

Faire un retour iterator éléments de la itérables et l'enregistrement d'une copie de chacun. Lorsque l'itérable est épuisée, renvoyez les éléments de la copie enregistrée. Répète indéfiniment

Puisque la valeur de direction n'existe pas dans directions, dropwhile regarde à travers un itérateur de longueur infinie et sans jamais atteindre un cas qui le casse