2017-09-02 1 views
-2

Je suis un débutant dans la programmation Python et ayant des problèmes avec ce programme simple qui calcule le prix de carrelage données 2 dimensions:NameError: nom « coût » ne se définit pas - lorsque vous appelez la fonction

Objective: Calculate the total cost of tile it would take to cover a floor plan of width and height, using a cost entered by the user.

print ("NOTE: The unit of cost is in dollars and dimension unit is in feet") 

def cost_o_tile(cost, width, height): 
    while True: 
     cost = int(input("Cost of each tile:")) 
     width = int(input("What is the width of the floor?")) 
     height = int(input("What is the height of the floor?")) 
     try: 
      if cost < 0 or width < 0 or height <0: 
       print ("\n Please enter non-negative integers") 
       break 
      else: 
       return ("In order to cover your {} X {} floor, you will need to pay {} dollars".format(width,height,cost*width*height)) 
     except ValueError: 
      print ("No valid integer! Please try again ...") 


cost_o_tile(cost, width, height) 

I comprendre que je peux déclarer les variables en dehors de la fonction et le code fonctionnerait. Cependant, je veux ces variables à l'intérieur de la boucle afin qu'elles puissent être validées par except ValueError.

+0

Où définissez-vous le coût? Pourquoi dépensez-vous des frais si c'est ce que vous essayez de calculer? Lorsque vous écrivez 'cost_o_tile (cost, width, height)', vous donnez les données de la fonction. – Carcigenicate

+0

@Carcigenicate: il a un coût par tuile (passé comme argument) et un coût pour l'ensemble du sol (ce qu'il calcule). –

+0

@HughBothwell Ah – Carcigenicate

Répondre

1

Eh bien, votre fonction cost_o_lite ne doit pas prendre un paramètre:

def cost_o_tile(): 
    ... 

print(cost_o_tile()) 

Et ne pas oublier d'imprimer le résultat.

Vous pouvez également les préoccupations distinctes:

d'abord écrire un algorithme pour calculer le coût total:

def cost_o_tile(cost, width, height): 
    if cost < 0 or width < 0 or height < 0: 
     raise ValueError 
    return cost * width * height 

Ensuite, écrivez utilisateur code d'interface:

print ("NOTE: The unit of cost is in dollars and dimension unit is in feet") 

while True: 
    try: 
     cost = int(input("Cost of each tile:")) 
     width = int(input("What is the width of the floor?")) 
     height = int(input("What is the height of the floor?")) 
     total = cost_o_tile(cost, width, height) 
     print("In order to cover your {} X {} floor, you will need to pay {} dollars" 
       .format(width, height, total)) 
     break 
    except ValueError: 
     print ("No valid integer! Please try again ...") 
+0

Cela fonctionne! Je vous remercie. Je n'aurais pas dû passer les arguments dans le paramètre avant de les définir. –

+1

@ThienNghiem Ce n'est pas une bonne pratique de programmation. –

0
cost_o_tile(cost, width, height) 

Le problème est avec l'argument cost lorsque vous appelez la fonction cost_o_tile dans la ligne 18 de votre code. Si vous regardez attentivement, il n'a pas été défini en dehors de la portée de la fonction, d'où l'erreur.

1

Rendre vos fonctions aussi pure que possible est une clé pour écrire du bon code, maintenable, et cela n'inclut certainement pas les boucles potentiellement infinies et les entrées de l'utilisateur. Il n'y a pas de variables cost, width, ou height dans la portée globale comme il se doit. Ceci est la cause de votre erreur.

  1. Le code d'entrée doit être déplacé à l'extérieur
  2. Supprimer boucles
  3. Vous pouvez vous soucier de la gestion des erreurs une fois que vous obtenez votre code de travail.

premier passage

def cost_o_tile(cost, width, height): 
    return ("In order to cover your {} X {} floor, you will need to pay {} dollars"\ 
          .format(width, height, cost * width * height)) 

cost, width, height = map(int, input("Enter 3 space separated integers: ").split()) 
print(cost_o_tile(cost, width, height)) 

second passage

Une fois que vous avez un travail de programme de base, vous pouvez regarder la gestion des erreurs:

def cost_o_tile(cost, width, height): 
    try: 
     if cost < 0 or width < 0 or height < 0: 
      return "Parameters cannot be lesser than 0" 
    except ValueError: 
     return "Please provide numbers only" 

    return ("In order to cover your {} X {} floor, you will need to pay {} dollars"\ 
          .format(width, height, cost * width * height)) 

cost, width, height = map(int, input("Enter 3 space separated integers: ").split()) 
print(cost_o_tile(cost, width, height)) 

col final

Maintenant, avec une erreur de manipulation en place, vous pouvez enfin regarder les boucles.

def cost_o_tile(cost, width, height): 
    try: 
     if cost < 0 or width < 0 or height < 0: 
      return "Parameters cannot be lesser than 0" 
    except ValueError: 
     return "Please provide numbers only" 

    return ("In order to cover your {} X {} floor, you will need to pay {} dollars"\ 
          .format(width, height, cost * width * height)) 

if __name__ == '__main__': 
    while True: 
     cost, width, height = map(int, input("Enter 3 space separated integers: ").split()) 
     print(cost_o_tile(cost, width, height)) 

     if input("Continue? ").lower() not in {'y', 'ye', 'yes'}: 
      break 
+1

La "bonne réponse". Je grince toujours quand je vois 'input' dans une fonction de calcul. Je pensais essayer d'expliquer la pureté et les effets secondaires, mais pourrait nuire au problème réel. – Carcigenicate

+0

Merci pour cette suggestion! Je vais essayer de suivre cette bonne pratique de programmation. –

+1

IMO, il n'est généralement pas une bonne habitude de transformer une exception en résultat (valeur de chaîne ici). Je préfère laisser l'exception descendre au code de l'appelant (la fonction principale je dirais). Vois ma réponse. –