簡體   English   中英

已解決:我的 Python 代碼返回 None 而不是列表

[英]SOLVED: My Python code returns None instead of a list

應該返回的值是有效的。??? 上面的 print(self.affichage) 表明它有效!!!! 為什么不退貨??? (最后的回歸)

所以這段代碼是一個波蘭倒數記法演算:你從左到右讀它,數字存儲在一堆中,操作數適用於堆的兩個高數(最近的兩個)

# 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

您僅在基本情況下返回一個值。 對於npi中的遞歸情況,您不會返回任何內容(即返回None )。 打印的值來自遞歸調用內部,一旦 go 返回調用方法,該調用的返回值就會丟失。

您需要為npi中的遞歸案例添加return語句

    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

你遞歸地調用npi 在最后一次調用中, traitement變量是True 但是您的代碼如下所示:

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

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

並退出 function 而不返回任何內容。 因此,在嘗試打印時,您會得到None object。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM