Решено: мой код Python возвращает None вместо списка - PullRequest
0 голосов
/ 22 апреля 2020

значение, которое должно быть возвращено, действительно !!!! Печать (self.affichage) чуть выше показывает, что это работает !!!! Почему это не возвращает ??? (самое последнее возвращение)

, поэтому этот код является исчислением обратной нотации Poli sh: вы читаете его слева направо, числа хранятся в стопке, а операнды применяются к двум верхним числам кучи (две самые последние)

# here comes the actual code :


class Calculatrice():

    # création de la mémoire de la calculatrice
    def __init__(self):
        self.pile = []
        self.affichage = []

    def traitement(self,element):
        # opérateur
        if element in "+-*/":

            # on vérifie qu'il y a les nombres suffisants pour effectuer ces opérations
            if len(self.pile) > 1:

                # addition
                if element == "+":
                    resultat = self.pile[-2] + self.pile[-1]

                # soustraction
                elif element == "-":
                    resultat = self.pile[-2] - self.pile[-1]

                # multiplication
                elif element == "*":
                    resultat = self.pile[-2] * self.pile[-1]

                # division
                elif element == "/":
                    resultat = self.pile[-2] / self.pile[-1]

                # ATTENTION : dans les cas de ces opérations, seuls deux nombres sont nécessaire,
                # donc on peut généraliser les deux actions suivantes, mais ça ne devrait pas forcément être le cas.

                # on dépile les nombres traités
                del self.pile[len(self.pile)-2:]
                # on empile le résultat
                self.pile.append(resultat)

                return True

            elif len(self.pile) == 1:
                if element == "*":
                    # erreur : pas assez de nombres pour effectuer une multiplication
                    print("Erreur 03 : Pas assez de nombres pour effectuer la multiplication.")

                    return False

                elif element == "/":
                    # erreur : pas assez de nombres pour effectuer une division
                    print("Erreur 04 : Pas assez de nombres pour effectuer la division.")

                    return False

                # si c'est une addition, on considère qu'on ajoute le nombre à 0, donc la pile ne change pas
                else:
                    # si c'est une soustraction, on empile son opposé à la place du nombre
                    if element == "-":
                        self.pile[-1] = (self.pile[-1] * (-1))

                    return True

            # la taille de la pile = 0, c-à-d. qu'aucun nombre n'a été stocké au préalable
            else:
                print("Erreur 02 : Pas assez de nombres pour effectuer une opération.")

                return False

        else:
            for car in element:
                if car not in "0123456789.":
                    # erreur : caractère non reconnu
                    print("Erreur 01 : La commande n'a pas été comprise.")

                    return False

            # si on est arrivé jusqu'ici, on va considérer que c'est bon et que c'est un nombre

            # on empile l'élément
            self.pile.append(float(element))

            return True




    def npi(self,chaine):

        # si la récurrence n'est pas à sa limite
        if len(chaine) != 0:

            # on vérifie qu'il y a des espaces
            if " " in chaine:

                # on parcourt la chaine jusqu'à l'espace suivant
                i = 0
                temp = ""
                while chaine[i] != " ":
                    temp = temp+chaine[i]
                    i += 1

                # on a fini d'extraire cet élément : on le traite.
                traitement = self.traitement(temp)
                # si il y a eu des erreurs de traitement : on arrête tout.
                if traitement == False:
                    return ["Erreur"]

                else:
                    # on continue de traiter le reste de la chaîne
                    self.npi(chaine[i+1:])

            else:
                # il n'y a pas d'espace, donc il n'y a qu'un seul élément : on le traite.
                traitement = self.traitement(chaine)
                # si il y a eu des erreurs de traitement : on arrête tout.
                if traitement == False:
                    return ["Erreur"]

                # on a fini, on sort du if
                self.npi("")

        else:
            # la chaîne est vide : tous les éléments ont été traités. On renvoie le résultat final et on réinitialise la pile.
            self.affichage = self.pile.pop()
            print(self.affichage)
            return self.affichage

c = Calculatrice()

print(c.npi("2 3 + 4 -"))
# doit retourner 1

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

Вы возвращаете значение только в базовом случае. Для рекурсивных случаев в npi вы ничего не возвращаете (т.е. возвращаете None). Напечатанное значение приходит из рекурсивного вызова, возвращаемое значение из этого вызова теряется, как только вы go возвращаетесь к вызывающему методу.

Вам необходимо добавить return операторов для рекурсивных случаев в npi

    def npi(self,chaine):

        # si la récurrence n'est pas à sa limite
        if len(chaine) != 0:

            # on vérifie qu'il y a des espaces
            if " " in chaine:

                # on parcourt la chaine jusqu'à l'espace suivant
                i = 0
                temp = ""
                while chaine[i] != " ":
                    temp = temp+chaine[i]
                    i += 1

                # on a fini d'extraire cet élément : on le traite.
                traitement = self.traitement(temp)
                # si il y a eu des erreurs de traitement : on arrête tout.
                if traitement == False:
                    return ["Erreur"]

                else:
                    # on continue de traiter le reste de la chaîne
                    return self.npi(chaine[i+1:])   # HERE

            else:
                # il n'y a pas d'espace, donc il n'y a qu'un seul élément : on le traite.
                traitement = self.traitement(chaine)
                # si il y a eu des erreurs de traitement : on arrête tout.
                if traitement == False:
                    return ["Erreur"]

                # on a fini, on sort du if
                return self.npi("")    # HERE

        else:
            # la chaîne est vide : tous les éléments ont été traités. On renvoie le résultat final et on réinitialise la pile.
            self.affichage = self.pile.pop()
            print(self.affichage)
            return self.affichage
0 голосов
/ 22 апреля 2020

Вы звоните npi рекурсивно. В последнем вызове переменная traitement равна True. Но ваш код выглядит следующим образом:

if traitement == False:
    return ["Erreur"]

else:
    # on continue de traiter le reste de la chaîne
    self.npi(chaine[i+1:])

и выходит из функции, ничего не возвращая. Таким образом, вы получаете объект None при попытке печати. ​​

...