2017-02-11 2 views
0

J'essaye d'imprimer le total de la liste d'achats mais chaque fois que j'appelle sur la chaîne elle imprime 0 au lieu de ce qu'elle devrait être.str réinitialisé à 0 lorsqu'il n'est pas invité?

cash_due = 0 
import pickle 
picklee = open('Store_stuff.pickle', 'rb') 
contents = pickle.load(picklee) 
picklee.close() 


shopping_list = ['Name  price  quantity  total'] 

store_contents ='''Store Contents 

Name  Price  GTIN-8 Code 
Butter  £1.20  70925647 
Chocolate £1.00  11826975 
Bread  £1.00  59217367 
Cheese  £2.80  98512508 
Bacon  £2.40  92647640 
Lamb  £4.80  49811230 
Ham   £2.59  53261496 
Potatoes £2.00  11356288 
Chicken  £3.40  89847268 
Eggs  £1.29  21271243''' 

def item(barcode, quantity, cash_due, shopping_list): 
    shopping_list.append(contents[barcode]['name']+'  £'+(str((int(contents[barcode]['price']))/100))+'   '+str(quantity)+'   £'+str((int(quantity)*int(contents[barcode]['price']))/100)) 
    print(cash_due) 
    print(contents[barcode]['price']) 
    print(quantity) 
    cash_due += ((int(contents[barcode]['price'])*(int(quantity)))/100) 
    print(cash_due) 

def shopkeeper_ui(): 
    print('Welcome to Stanmore\'s Food Emporium! Feel free to browse.') 
    print(store_contents) 
    user_input = '' 

    while user_input != 'finish': 
     user_input = input('''Welcome to the checkout. 
instructions - 
if you are entering text make sure your \'CAP\'s Lock\' is turned off 
if you are entering a barcode number, please enter it carefully 
if you want to print your current recipt, enter \'recipt\' 
if you want to see your current total, enter \'total\' 
and if you are finished, enter \'finish\' 

You can see the stores contents below 
Thanks for shopping: ''') 

     if len(user_input) == 8: 
      quantity = int(input('Enter the quantity that you want: ')) 
      item(user_input, quantity, cash_due, shopping_list) 
     elif user_input == 'recipt': 
      count8 = 0 
      for i in shopping_list: 
       print(shopping_list[count8]) 
       count8 += 1 
     elif user_input == 'finish': 
      print('Your shopping list is',shopping_list,' \nand your total was', total,'\n Thank you for shopping with Stanmore\'s Food Emporium') 
     elif user_input == 'total': 
      print('your total is, £',cash_due) 
     else: 
      print('User_input not valid. Try again...') 
shopkeeper_ui() 

Si j'entre le code et ma première entrée est 21271243 (le code à barres pour les œufs). alors j'entre 4 pour la quantité. je peux obtenir le shopping_listlist pour comprendre le total et si j'imprime la chaîne cash_due à l'intérieur de la fonction de l'élément qu'il comprend mais dès que j'essaie de cash_due appeler de la fonction shopkeeper_ui il imprime 0 au lieu de ce qui devrait être 5,12?

+1

cash_due n'est pas modifiable. La modification de la fonction de l'élément est perdue lorsque vous quittez la fonction. –

+0

ok donc savez-vous un moyen de faire le changement rester hors de la fonction – Lomore

Répondre

2

cash_due is not mutable. Les modifications de la fonction item sont perdues lorsque vous quittez la fonction.

En général, la sortie de c'est de laisser la fonction (item) renvoie la valeur.

Dans ce cas, je voudrais juste garder cash_due sur item fonction et item seulement retourner le coût pour cet article. Quelque chose comme ceci:

def item(barcode, quantity, shopping_list): 
    shopping_list.append(contents[barcode]['name']+'  £'+(str((int(contents[barcode]['price']))/100))+'   '+str(quantity)+'   £'+str((int(quantity)*int(contents[barcode]['price']))/100)) 
    print(contents[barcode]['price']) 
    print(quantity) 
    cost = ((int(contents[barcode]['price'])*(int(quantity)))/100) 
    print(cost) 
    return cost 

[...] 

     if len(user_input) == 8: 
      quantity = int(input('Enter the quantity that you want: ')) 
      cash_due += item(user_input, quantity, shopping_list) 

Vous n'avez pas le même problème avec shopping_list parce qu'il est mutable: il est changé en place. Lisez à propos de mutables pour comprendre le concept.

Cependant, il pourrait être une meilleure conception de ne pas laisser l'article modifier la liste. Il pourrait juste renvoyer l'élément de liste et le coût, et l'appelant modifierait la liste.

def item(barcode, quantity): 
    stuff = (contents[barcode]['name']+'  £'+(str((int(contents[barcode]['price']))/100))+'   '+str(quantity)+'   £'+str((int(quantity)*int(contents[barcode]['price']))/100)) 
    cost = ((int(contents[barcode]['price'])*(int(quantity)))/100) 
    return stuff, cost 

[...] 

     if len(user_input) == 8: 
      quantity = int(input('Enter the quantity that you want: ')) 
      stuff, cost = item(user_input, quantity, shopping_list) 
      shopping_list.append(stuff) 
      cash_due += cost