【问题标题】:SOLVED: My Python code returns None instead of a list已解决:我的 Python 代码返回 None 而不是列表
【发布时间】:2020-08-05 13:31:17
【问题描述】:

应该返回的值是有效的!!!! 上面的 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

【问题讨论】:

  • 不返回是什么意思?你希望它做什么?
  • 对不起@SuperStew 我没有看到你的评论,但现在已经解决了!我希望它返回一个列表(self.affichage)

标签: python return return-value nonetype


【解决方案1】:

您只在基本情况下返回一个值。对于npi 中的递归案例,您不会返回任何内容(即返回None)。打印的值来自递归调用内部,一旦返回调用方法,该调用的返回值就会丢失。

您需要为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

【讨论】:

    【解决方案2】:

    你递归调用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 对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-05
      • 2015-07-03
      • 2018-06-25
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      相关资源
      最近更新 更多