Как я могу иметь пользовательский вызов в словаре с функцией ввода в Python - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь создать проект, в котором я могу ввести ввод рецепта и сколько партий этого конкретного рецепта затем сложить все одинаковые ингредиенты, которые мне понадобятся.У меня будет около 100+ рецептов на выбор.Что было бы лучшим способом сделать это без использования 100+ операторов elif.

from collections import Counter
c=Counter({})
def format():
    for i in c:
       print(i,round(c[i],2))

def multiply(dict, amount):
    for key in dict:
        dict[key] *= amount
    c.update(dict)

def make():
global c
while True:
    my_input = input('choose formual : ')
    if my_input == 'done':
        break
    elif my_input == 'recipe1':
        batches=float(input('how many : '))
        multiply(recipe1, batches)
    elif my_input == 'recipe2':
        my_input=float(input('how many : '))
        multiply(recipe2, batches)
    else:
        'no fomula with that name. type done if you are finished. '

recipe1={'eggs':2,'milk':37, 'sugar':12}
recipe2={'eggs':3,'milk':14.5, 'sugar':8, 'flour':14.6}

make()
format()

Так что, скажем, если бы я вызвал recipe1 в 3 партии и recipe2 в 5 партиях, мой вывод будет

eggs 15.0
milk 154.5
sugar 60.0
flour 43.8

Это работает, но не очень эффективное кодирование, кто-нибудь может подсказать мне лучший способ выбрать эти рецепты?Я использую Python только около полутора месяцев, так что все еще довольно плохо знаком со всем.заранее спасибо!

1 Ответ

0 голосов
/ 24 сентября 2019

Вы обязательно должны использовать словарь formula -> ingredients, потому что вы можете легко проверить существование формулы и вернуть список доступных формул.

Некоторые второстепенные моменты:

  • Counter() инициализация не требует пустого слова;
  • не использует глобальную переменную, но параметры (или поля, если вам удобны классы);
  • не используют dict илилюбое встроенное ключевое слово в качестве имени переменной (также избегайте format);
  • используйте d.items() для получения значений вместе с ключами dict;
  • используйте строки формата для создания красивогоoutput;
  • проверить входные данные на наличие ошибок преобразования (является ли число вводом?).

Я предлагаю следующий код:

from collections import Counter

def display(c):
    for k, v in c.items():
       print(f"{k:<16}{v:>12.2f}") # k is left aligned, v right aligned, precision 2

def make(ingredients_by_formula):
    c = Counter()
    while True:
        formula = input('Choose formula ("done" to end, "list" to list formulas): ')
        if formula == 'done':
            break
        elif formula == 'list':
            print(list(ingredients_by_formula))
        else:
            try:
                ingredients = ingredients_by_formula[formula]
                amount = float(input('how many : '))
            except KeyError:
                print('no formula with that name!')
            except ValueError:
                print('a number please!')
            else:
                c.update({k: v * amount for k, v in ingredients.items()})

    return c

ingredients_by_formula = {
    'recipe1': {'eggs':2,'milk':37, 'sugar':12},
    'recipe2': {'eggs':3,'milk':14.5, 'sugar':8, 'flour':14.6}
}

display(make(ingredients_by_formula))

Я использовалпростое понимание dict для обновления dict: сопоставьте каждый ключ с amount значениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...