2016-06-29 5 views
0

Я изучаю python, и у меня есть простая проблема с моей программой. У меня есть два словаря с ключами в виде строки и значения, связанные с ними. Допустим, что это магазин с фруктами и ценами.Уменьшение значения в словаре

shopping_list = ["banana", "orange", "apple"] 

stock = { 
    "banana": 6, 
    "apple": 0, 
    "orange": 32, 
    "pear": 15 
} 

prices = { 
    "banana": 4, 
    "apple": 2, 
    "orange": 1.5, 
    "pear": 3 
} 

# Function to calculate the bill 
def compute_bill(food): 
    total = 0 

    for number in food: 
     if (stock[number]>0): 
      total += prices[number] 
      stock[number] -= 1 
    return total 

print compute_bill(shopping_list) 

Если фрукты в наличии, добавьте цену на счет и уменьшите сумму на складе. Если нет, ничего не делайте.

Сообщение об ошибке:

вызова compute_bill со списком, содержащим 1 яблоко, 1 груша и 1 банан в результате 0 вместо правильного 7

Я не знаю, почему этот код не работает правильно.

+1

получить обратно оттуда. Вы хотите, чтобы все элементы запускались до завершения функции. –

+0

так он все еще не работает? –

+0

@ Ev.Kounis работает сейчас. Одна лишняя строка. :) – Maltesse

ответ

1

Есть две вещи неправильно здесь:

  • Вы возвращаетесь сразу после тестирования первого пункта, не обращая внимания на остальные ваши вопросы. return выходит из функции, в тот момент, когда Python выполняет ее.
  • Вы уменьшаете свои запасы в неположенном месте, вне цикла.

И нужно исправлять:

def compute_bill(food): 
    total = 0 

    for item in food: 
     if stock[item] > 0: 
      # this item is in stock. Add the price to the total, 
      # and reduce the stock by one. 
      total += prices[item] 
      stock[item] -= 1 
    # with the loop done, return the total sum of all items 
    # that were in stock. 
    return total 

Теперь, вместо того, чтобы немедленно возвращался total для пункта первый вы проверить, вы проверить все элементы. И всякий раз, когда вы нашли товар, который есть на складе, вы добавляете цену за этот один элемент к общей сумме и уменьшаете запас для этого предмета на 1.

В последней детали, тестер Академии Академии называет функцию compute_bill()для вас.Не называйте это самим в своем коде, иначе тест завершится неудачно, поскольку вы сначала изменили запас. Удалите линию print compute_fill(shopping_list).

+0

Привет, прямо сейчас он говорит мне, что я вызываю функцию до того, как запас был уменьшен: «Фондовый не выглядит совершенно правильно! Не забудьте не вызывать compute_bill, поскольку он меняет запас! Он должен содержать: {'orange' : 32, 'pear': 15, 'banana': 6, 'apple': 0} " – Maltesse

+0

@Maltesse: ах, нет, вы не должны вызывать функцию * самостоятельно *. Удалите строку 'print compute_bill (shopping_list)', тестер делает это * для вас *. –

+0

Спасибо. Последняя строка была неправильной, когда я вызывал функцию, передавая shopping_list. Спасибо за вашу помощь! – Maltesse

1

Проблема в том, что ваши функции заканчиваются преждевременно из-за вызова return в вашем заявлении if.

Они, как ваш код, функция проверит один элемент из корзины, а затем выйдет. То, что у вас есть и что нужно сделать, это проверить все элементов, добавить их цены к вашему итогу и уменьшить их размер в зависимости от вашего предложения. Чтобы сделать это, ваша функция должна быть изменена следующим образом:

def compute_bill(food): 
    total = 0 

    for item in food: 
     if stock[item]>0: 
      total += prices[item] 
      stock[item] -= 1 
    return total 

Как вы можете видеть, else часть была вывезена, а также. Поскольку никакие действия не предпринимаются, если запрашиваемый элемент отсутствует или даже не существует, нет никаких оснований для того, чтобы вы пытались обработать что-либо.

Заключительное примечание состоит в том, что скобки в вашем заявлении if не нужны в этом случае. Это очень простая проверка, которую вы делаете, и попытка упорядочить порядок операций является излишней, поскольку значение тривиально.

+0

@MartijnPieters Я опубликовал комментарий к вопросу OP и не думал снова объяснять логику, но вы совершенно правы. Теперь лучше? –

+0

* много * лучше сейчас, спасибо за обновление. Комментарии являются эфемерными и могут быть удалены в любое время. –

0

returns завершает функцию и возвращает значение обратно в функцию. Если вы вернетесь внутри цикла, остальная часть цикла больше не будет работать, и вы учтите только первый элемент.

Смежные вопросы