[英]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.