Получаю ошибку: TypeError: rKKal() missing 1 required positional argument: 'age'

Ника

Новичок
Пользователь
Окт 17, 2020
26
0
1
Здравствуйте! Подскажите, пожалуйста, как реализовать меню в виде класса (должен производиться ввод данных, которые сейчас являются переменными weight ,height, age, gender, Kf, mission, а также пользователь должен вводить номер пункта меню от 0 до 6 )? Необходимо, чтобы в программе были только классы (без внешних переменных и функций). Ввод данных и выбор пункта меню не обязательно должны находиться в одном классе, можно в разных, если так будет целесообразнее. Полный код программы прикрепляю. В данном виде она выдаёт ошибку: rKKal() missing 1 required positional argument: 'age' при выборе 1 пунка меню.

Надеюсь на понимание (я только учусь) и помощь в виде развёрнутого ответа. Благодарю.
Python:
weight = 48
height = 170
age = 20
gender = "Ж"
Kf = 1.2
mission = 1


class Nutrition:
    """класс питание"""

    def __init__(self):
        pass

    # рекомендованное количество ккал для потребления человеком за день
    def rKKal(self, gender, Kf, weight, height, age):
        kkal = 0
        if (gender == "М"):
            kkal = Kf * (66.5 + 13.75 * weight + 5.003 * height - 6.775 * age)
        elif (gender == "Ж"):
            kkal = Kf * (665.1 + 9.563 * weight + 1.85 * height - 4.676 * age)
        else:
            print("неправильно введён пол")
        return kkal

    # расчет нормы нутриентов (жбу) в зависимости от цели
    def norNutr(self, REK_K, mission):
        REK_g, REK_b, REK_u = 0, 0, 0
        if (mission == 1):
            # набор массы
            REK_g = round(REK_K * 0.30 / 9, 2)
            REK_b = round(REK_K * 0.35 / 4, 2)
            REK_u = round(REK_K * 0.55 / 4, 2)

        elif (mission == 2):
            # сброс веса
            REK_g = round(REK_K * 0.10 / 9, 2)
            REK_b = round(REK_K * 0.30 / 4, 2)
            REK_u = round(REK_K * 0.60 / 4, 2)

        elif (mission == 3):
            # поддержание веса
            REK_g = round(REK_K * 0.30 / 9, 2)
            REK_b = round(REK_K * 0.30 / 4, 2)
            REK_u = round(REK_K * 0.40 / 4, 2)

        else:
            print(" неправельно введён номер цели ")

        return [REK_g, REK_b, REK_u]

    # подсчет суммы калорий
    def summ_kkal(self):
        obj = list()
        k1 = list()
        s = 0
        N = int(input("введите кол-во продуктов: "))
        for p in range(N):
            # name = input("название продукта : ")
            # g = float(input("жиры = "))
            # b = float(input("белки = "))
            # u = float(input("углеводы = "))
            # k = float(input("калории = "))

            obj.append(Product())
            k1.append(obj[p].k)
        for elem in k1:
            s = s + elem

        print("Сумма калорий = ", s)
        # print("K_m :")
        # print(k1)
        return s

    # рекомендованное кол-во нутриентов и калорий в день
    def rek(self):

        k1 = Nutrition.rKKal(gender, Kf, weight, height, age)
        g1, b1, u1 = Nutrition.norNutr(k1, mission)
        # print(g1, b1, u1)
        print("рекомендованное кол-во ккал в день = " + str(k1) + " гр.")
        print("рекомендованное кол-во белков в день = " + str(g1) + " гр.")
        print("рекомендованное кол-во жиров в день = " + str(b1) + " гр.")
        print("рекомендованное кол-во углеводов в день = " + str(u1) + " гр.")

    # оптимальное распределение калорий между завтраком, обедом, ужином и перекусом
    def optimal_KK(self, REK_K):
        okz = round(REK_K * 0.25, 2)
        oko = round(REK_K * 0.4, 2)
        oku = round(REK_K * 0.2, 2)
        okp = round(REK_K * 0.15, 2)
        return [okz, oko, oku, okp]


class Product:
    """класс продукт"""

    def __init__(self):
        name = input("введите название продукта: ")
        g = int(input("введите кол-во жиров: "))
        b = int(input("введите кол-во белков: "))
        u = int(input("введите кол-во углеводов: "))
        k = int(input("введите кол-во калорий: "))

        self.name = name
        self.g = g
        self.b = b
        self.u = u
        self.k = k


    # вычисление кол-ва ккал и жбу на фактический вес продукта
    def converter(self):

        weight = float(input("вес продукта: "))
        gg = Product.g * (weight / 100)
        bb = Product.b * (weight / 100)
        uu = Product.u * (weight / 100)
        kk = Product.k * (weight / 100)

        # print("вес продукта в граммах = ", weight)

        print("кол-во жиров в " + str(weight) + " гр. продукта = ", round(gg, 2))
        print("кол-во белков в " + str(weight) + " гр. продукта= ", round(bb, 2))
        print("кол-во углеводов в " + str(weight) + " гр. продукта = ", round(uu, 2))
        print("кол-во калорий в " + str(weight) + " гр.продукта = ", round(kk, 2))


class Breakfast(Nutrition):
    """ класс завтрак """

    # проверка кол-ва ккал на оптимальность для завтрака
    def optimal_Z(self, s):
        optimal = Breakfast.optimal_KK(Breakfast.rKKal(gender, Kf, weight, height, age))

        # оптимальное кол-во ккал на завтрак
        optimal_KZ = optimal[0]

        if (optimal_KZ - 20 < s < optimal_KZ + 20):
            print("оптимальное кол-во калорий на завтрак")
        elif (optimal_KZ - 20 > s):
            print("кол-во калорий НЕ оптимально для завтрака: необходимо увеличить калорийность завтрака")
        elif (s > optimal_KZ + 20):
            print("кол-во калорий НЕ оптимально для завтрака: необходимо уменьшить калорийность завтрака")

    #определение оптимальности кол-ва ккал для завтрака из нескольких продуктов
    def Zz_optimal(self):
        Breakfast.optimal_Z(Breakfast.summ_kkal())


class Lunch(Nutrition):
    """ класс обед """

    # проверка кол-ва ккал на оптимальность для обеда
    def optimal_O(self, s):
        optimal = Lunch.optimal_KK(Lunch.rKKal(gender, Kf, weight, height, age))

        # оптимальное кол-во ккал на обед
        optimal_KO = optimal[1]

        if (optimal_KO - 50 < s < optimal_KO + 50):
            print("оптимальное кол-во калорий на обед")
        elif (optimal_KO - 50 > s):
            print("кол-во калорий НЕ оптимально для обеда: необходимо увеличить калорийность обеда")
        elif (s > optimal_KO + 50):
            print("кол-во калорий НЕ оптимально для обеда: необходимо уменьшить калорийность обеда")

    # определение оптимальности кол-ва ккал для обеда из нескольких продуктов
    def Oo_optimal(self):
        Lunch.optimal_O(Lunch.summ_kkal())

class Dinner(Nutrition):
    """ класс ужин """

    # проверка кол-ва ккал на оптимальность для ужина
    def optimal_U(self, s):
        optimal = Dinner.optimal_KK(Dinner.rKKal(gender, Kf, weight, height, age))

        # оптимальное кол-во ккал на ужин
        optimal_KU = optimal[2]

        if (optimal_KU - 40 < s < optimal_KU + 40):
            print("оптимальное кол-во калорий на ужин")
        elif (optimal_KU - 40 > s):
            print("кол-во калорий НЕ оптимально для ужина: необходимо увеличить калорийность ужина")
        elif (s > optimal_KU + 40):
            print("кол-во калорий НЕ оптимально для ужина: необходимо уменьшить калорийность ужина")

    def Uu_optimal(self):
        Dinner.optimal_U(Dinner.summ_kkal())

class Snack(Nutrition):
    """ класс перекус """

    # проверка кол-ва ккал на оптимальность для перекуса
    def optimal_P(self, s):
        optimal = Snack.optimal_KK(Snack.rKKal(gender, Kf, weight, height, age))

        # оптимальное кол-во ккал в перекус
        optimal_KP = optimal[3]

        if (optimal_KP - 10 < s < optimal_KP + 10):
            print("оптимальное кол-во калорий для перекуса")
        elif (optimal_KP - 50 > s):
            print("кол-во калорий НЕ оптимально для перекуса: необходимо увеличить калорийность перекуса")
        elif (s > optimal_KP + 50):
            print("кол-во калорий НЕ оптимально для перекуса: необходимо уменьшить калорийность перекуса")

    def Pp_optimal(self):
        Snack.optimal_P(Snack.summ_kkal())

class Menu(Product, Breakfast, Lunch, Dinner, Snack):
    """ класс меню """

    def PrintMenu(self):
        print("_______________________М Е Н Ю_______________________")
        print(" 1 - узнать реокмендованное кол-во ЖБУ и ккал в день")
        print(" 2 - проверка калорийности завтрака на оптимальность ")
        print(" 3 - проверка калорийности обеда на оптимальность ")
        print(" 4 - проверка калорийности ужина на оптимальность ")
        print(" 5 - проверка калорийности перекуса на оптимальность ")
        print(" 6 - расчет ЖБУ и ккал на фактический вес продукта ")
        print(" 0 - ВЫХОД ")
        print()

        while (True):
            enter = int(input("введите номер пункта меню : "))

            if enter == 1:
                print()

                Menu.rek()
                print()
            elif enter == 2:
                print()

                Menu.Zz_optimal()
                print()
            elif enter == 3:
                print()
                #Menu = Menu()
                Menu.Oo_optimal()
                print()
            elif enter == 4:
                print()
                #Menu = Menu()
                Menu.Uu_optimal()
                print()
            elif enter == 5:
                print()
                #Menu = Menu()
                Menu.Pp_optimal()
                print()
            elif enter == 6:
                print()
                #Menu = Menu()
                Menu.converter()
                print()
            elif enter == 0:
                exit()


Menu = Menu()
Menu.PrintMenu()
 
Последнее редактирование:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Подскажите, пожалуйста, как реализовать меню в виде класса
Вот пример:
Python:
class Nutrition:
    """класс питание"""

    def __init__(self):
        self.height = int(input("Введите ваш рост (в см): "))
        self.weight = int(input("Введите ваш вес (в кг): "))
        self.age = int(input("Введите ваш возраст: "))
        self.gender = input("Введите ваш пол (м/ж): ").lower()
        while self.gender not in ["м", "ж"]:
            print("Неправильно введён пол")
            self.gender = input("Введите ваш пол (м/ж): ").lower()
        self.Kf = float(input("Введите ваш коэффициент: "))
        self.mission = int(input("Введите номер цели (1, 2 или 3): "))
        while self.mission not in [1, 2, 3]:
            print("Неправильно введён номер цели ")
            self.mission = int(input("Введите номер цели (1, 2 или 3): "))
        self.rkkal = self.rKKal()

    def rKKal(self):
        """Рекомендованное количество ккал для потребления человеком за день"""

        if self.gender == "м":
            return self.Kf * (66.5 + 13.75 * self.weight +
                5.003 * self.height - 6.775 * self.age)
        elif self.gender == "ж":
            return self.Kf * (665.1 + 9.563 * self.weight +
                1.85 * self.height - 4.676 * self.age)

    def norNutr(self):
        """Расчет нормы нутриентов (жбу) в зависимости от цели"""

        REK_g, REK_b, REK_u = 0, 0, 0
        if self.mission == 1:
            # набор массы
            REK_g = round(self.rkkal * 0.30 / 9, 2)
            REK_b = round(self.rkkal * 0.35 / 4, 2)
            REK_u = round(self.rkkal * 0.55 / 4, 2)

        elif self.mission == 2:
            # сброс веса
            REK_g = round(self.rkkal * 0.10 / 9, 2)
            REK_b = round(self.rkkal * 0.30 / 4, 2)
            REK_u = round(self.rkkal * 0.60 / 4, 2)

        elif self.mission == 3:
            # поддержание веса
            REK_g = round(self.rkkal * 0.30 / 9, 2)
            REK_b = round(self.rkkal * 0.30 / 4, 2)
            REK_u = round(self.rkkal * 0.40 / 4, 2)

        return [REK_g, REK_b, REK_u]

    def summ_kkal(self):
        """Подсчет суммы калорий"""
        n = int(input("Введите кол-во продуктов: "))

        products = [Product() for p in range(n)]

        s = sum([p.kk for p in products])
        print("Сумма калорий = ", s)
        return s

    def rek(self):
        """Рекомендованное кол-во нутриентов и калорий в день"""
        g1, b1, u1 = self.norNutr()
        print(f"Рекомендованное кол-во ккал в день = {self.rkkal:.2f} гр.")
        print(f"Рекомендованное кол-во белков в день = {g1:.2f} гр.")
        print(f"Рекомендованное кол-во жиров в день = {b1:.2f} гр.")
        print(f"Рекомендованное кол-во углеводов в день = {u1:.2f} гр.")

    def optimal_KK(self):
        """Оптимальное распределение калорий между завтраком,
           обедом, ужином и перекусом"""
        okz = round(self.rkkal * 0.25, 2)
        oko = round(self.rkkal * 0.4, 2)
        oku = round(self.rkkal * 0.2, 2)
        okp = round(self.rkkal * 0.15, 2)
        return [okz, oko, oku, okp]

    def test_nutrition(self, param):
        """Проверка оптимальности количества калорий"""
        nutr_name = {0: "завтрак", 1: "обед", 2: "ужин", 3: "перекус"}
        nutr_delta = {0: 20, 1: 50, 2: 40, 3: 10}
        s = self.summ_kkal()
        optimal = self.optimal_KK()[param]
        name = nutr_name[param]
        delta = nutr_delta[param]

        if optimal - delta < s < optimal + delta:
            print(f"Оптимальное кол-во калорий на {name}")
        elif optimal - delta > s:
            print(f"Кол-во калорий НЕ оптимально для {name}а: "
                  f"необходимо увеличить калорийность {name}а")
        elif s > optimal + delta:
            print(f"Кол-во калорий НЕ оптимально для {name}а: "
                  f"необходимо уменьшить калорийность {name}а")


class Product:
    """Класс продукт"""

    def __init__(self):
        self.name = input("Введите название продукта: ")
        self.g = float(input("Введите кол-во жиров: "))
        self.b = float(input("Введите кол-во белков: "))
        self.u = float(input("Введите кол-во углеводов: "))
        self.k = float(input("Введите кол-во калорий: "))
        self.weight = float(input("Введите вес продукта (в гр.): "))
        self.gg = self.g * (self.weight / 100)
        self.bb = self.b * (self.weight / 100)
        self.uu = self.u * (self.weight / 100)
        self.kk = self.k * (self.weight / 100)

    def info(self):
        """Информация о продукте"""
        print(f"Кол-во жиров в {self.weight} гр. продукта = {self.gg:.2f}")
        print(f"Кол-во белков в {self.weight} гр. продукта = {self.bb:.2f}")
        print(f"Кол-во углеводов в {self.weight} гр. продукта = {self.uu:.2f}")
        print(f"Кол-во калорий в {self.weight} гр. продукта = {self.kk:.2f}")


class Menu():
    """ Класс меню """

    def __init__(self):
        self.n = Nutrition()

    def PrintMenu(self):
        print()
        print("_______________________М Е Н Ю_______________________")
        print(" 1 - узнать рекомендованное кол-во ЖБУ и ккал в день")
        print(" 2 - проверка калорийности завтрака на оптимальность ")
        print(" 3 - проверка калорийности обеда на оптимальность ")
        print(" 4 - проверка калорийности ужина на оптимальность ")
        print(" 5 - проверка калорийности перекуса на оптимальность ")
        print(" 6 - расчет ЖБУ и ккал на фактический вес продукта ")
        print(" 0 - ВЫХОД ")
        print()

        while (True):
            enter = int(input("Введите номер пункта меню : "))

            if enter == 1:
                print()
                self.n.rek()
                print()
            elif enter == 2:
                print()
                # 0 - завтрак
                self.n.test_nutrition(0),
                print()
            elif enter == 3:
                print()
                # 1 - обед
                self.n.test_nutrition(1),
                print()
            elif enter == 4:
                print()
                # 3 - ужин
                self.n.test_nutrition(2),
                print()
            elif enter == 5:
                print()
                # 4 - перекус
                self.n.test_nutrition(3),
                print()
            elif enter == 6:
                print()
                p = Product()
                p.info()
                print()
            elif enter == 0:
                exit()


menu = Menu()
menu.PrintMenu()
 
  • Мне нравится
Реакции: Ника

Ника

Новичок
Пользователь
Окт 17, 2020
26
0
1
Вот пример:
Python:
class Nutrition:
    """класс питание"""

    def __init__(self):
        self.height = int(input("Введите ваш рост (в см): "))
        self.weight = int(input("Введите ваш вес (в кг): "))
        self.age = int(input("Введите ваш возраст: "))
        self.gender = input("Введите ваш пол (м/ж): ").lower()
        while self.gender not in ["м", "ж"]:
            print("Неправильно введён пол")
            self.gender = input("Введите ваш пол (м/ж): ").lower()
        self.Kf = float(input("Введите ваш коэффициент: "))
        self.mission = int(input("Введите номер цели (1, 2 или 3): "))
        while self.mission not in [1, 2, 3]:
            print("Неправильно введён номер цели ")
            self.mission = int(input("Введите номер цели (1, 2 или 3): "))
        self.rkkal = self.rKKal()

    def rKKal(self):
        """Рекомендованное количество ккал для потребления человеком за день"""

        if self.gender == "м":
            return self.Kf * (66.5 + 13.75 * self.weight +
                5.003 * self.height - 6.775 * self.age)
        elif self.gender == "ж":
            return self.Kf * (665.1 + 9.563 * self.weight +
                1.85 * self.height - 4.676 * self.age)

    def norNutr(self):
        """Расчет нормы нутриентов (жбу) в зависимости от цели"""

        REK_g, REK_b, REK_u = 0, 0, 0
        if self.mission == 1:
            # набор массы
            REK_g = round(self.rkkal * 0.30 / 9, 2)
            REK_b = round(self.rkkal * 0.35 / 4, 2)
            REK_u = round(self.rkkal * 0.55 / 4, 2)

        elif self.mission == 2:
            # сброс веса
            REK_g = round(self.rkkal * 0.10 / 9, 2)
            REK_b = round(self.rkkal * 0.30 / 4, 2)
            REK_u = round(self.rkkal * 0.60 / 4, 2)

        elif self.mission == 3:
            # поддержание веса
            REK_g = round(self.rkkal * 0.30 / 9, 2)
            REK_b = round(self.rkkal * 0.30 / 4, 2)
            REK_u = round(self.rkkal * 0.40 / 4, 2)

        return [REK_g, REK_b, REK_u]

    def summ_kkal(self):
        """Подсчет суммы калорий"""
        n = int(input("Введите кол-во продуктов: "))

        products = [Product() for p in range(n)]

        s = sum([p.kk for p in products])
        print("Сумма калорий = ", s)
        return s

    def rek(self):
        """Рекомендованное кол-во нутриентов и калорий в день"""
        g1, b1, u1 = self.norNutr()
        print(f"Рекомендованное кол-во ккал в день = {self.rkkal:.2f} гр.")
        print(f"Рекомендованное кол-во белков в день = {g1:.2f} гр.")
        print(f"Рекомендованное кол-во жиров в день = {b1:.2f} гр.")
        print(f"Рекомендованное кол-во углеводов в день = {u1:.2f} гр.")

    def optimal_KK(self):
        """Оптимальное распределение калорий между завтраком,
           обедом, ужином и перекусом"""
        okz = round(self.rkkal * 0.25, 2)
        oko = round(self.rkkal * 0.4, 2)
        oku = round(self.rkkal * 0.2, 2)
        okp = round(self.rkkal * 0.15, 2)
        return [okz, oko, oku, okp]

    def test_nutrition(self, param):
        """Проверка оптимальности количества калорий"""
        nutr_name = {0: "завтрак", 1: "обед", 2: "ужин", 3: "перекус"}
        nutr_delta = {0: 20, 1: 50, 2: 40, 3: 10}
        s = self.summ_kkal()
        optimal = self.optimal_KK()[param]
        name = nutr_name[param]
        delta = nutr_delta[param]

        if optimal - delta < s < optimal + delta:
            print(f"Оптимальное кол-во калорий на {name}")
        elif optimal - delta > s:
            print(f"Кол-во калорий НЕ оптимально для {name}а: "
                  f"необходимо увеличить калорийность {name}а")
        elif s > optimal + delta:
            print(f"Кол-во калорий НЕ оптимально для {name}а: "
                  f"необходимо уменьшить калорийность {name}а")


class Product:
    """Класс продукт"""

    def __init__(self):
        self.name = input("Введите название продукта: ")
        self.g = float(input("Введите кол-во жиров: "))
        self.b = float(input("Введите кол-во белков: "))
        self.u = float(input("Введите кол-во углеводов: "))
        self.k = float(input("Введите кол-во калорий: "))
        self.weight = float(input("Введите вес продукта (в гр.): "))
        self.gg = self.g * (self.weight / 100)
        self.bb = self.b * (self.weight / 100)
        self.uu = self.u * (self.weight / 100)
        self.kk = self.k * (self.weight / 100)

    def info(self):
        """Информация о продукте"""
        print(f"Кол-во жиров в {self.weight} гр. продукта = {self.gg:.2f}")
        print(f"Кол-во белков в {self.weight} гр. продукта = {self.bb:.2f}")
        print(f"Кол-во углеводов в {self.weight} гр. продукта = {self.uu:.2f}")
        print(f"Кол-во калорий в {self.weight} гр. продукта = {self.kk:.2f}")


class Menu():
    """ Класс меню """

    def __init__(self):
        self.n = Nutrition()

    def PrintMenu(self):
        print()
        print("_______________________М Е Н Ю_______________________")
        print(" 1 - узнать рекомендованное кол-во ЖБУ и ккал в день")
        print(" 2 - проверка калорийности завтрака на оптимальность ")
        print(" 3 - проверка калорийности обеда на оптимальность ")
        print(" 4 - проверка калорийности ужина на оптимальность ")
        print(" 5 - проверка калорийности перекуса на оптимальность ")
        print(" 6 - расчет ЖБУ и ккал на фактический вес продукта ")
        print(" 0 - ВЫХОД ")
        print()

        while (True):
            enter = int(input("Введите номер пункта меню : "))

            if enter == 1:
                print()
                self.n.rek()
                print()
            elif enter == 2:
                print()
                # 0 - завтрак
                self.n.test_nutrition(0),
                print()
            elif enter == 3:
                print()
                # 1 - обед
                self.n.test_nutrition(1),
                print()
            elif enter == 4:
                print()
                # 3 - ужин
                self.n.test_nutrition(2),
                print()
            elif enter == 5:
                print()
                # 4 - перекус
                self.n.test_nutrition(3),
                print()
            elif enter == 6:
                print()
                p = Product()
                p.info()
                print()
            elif enter == 0:
                exit()


menu = Menu()
menu.PrintMenu()
Спасибо Вам огромное за пример и за отредактированный код, это очень ценно для того, кто учится)
 

Ника

Новичок
Пользователь
Окт 17, 2020
26
0
1
Вот пример:
Python:
class Nutrition:
    """класс питание"""

    def __init__(self):
        self.height = int(input("Введите ваш рост (в см): "))
        self.weight = int(input("Введите ваш вес (в кг): "))
        self.age = int(input("Введите ваш возраст: "))
        self.gender = input("Введите ваш пол (м/ж): ").lower()
        while self.gender not in ["м", "ж"]:
            print("Неправильно введён пол")
            self.gender = input("Введите ваш пол (м/ж): ").lower()
        self.Kf = float(input("Введите ваш коэффициент: "))
        self.mission = int(input("Введите номер цели (1, 2 или 3): "))
        while self.mission not in [1, 2, 3]:
            print("Неправильно введён номер цели ")
            self.mission = int(input("Введите номер цели (1, 2 или 3): "))
        self.rkkal = self.rKKal()

    def rKKal(self):
        """Рекомендованное количество ккал для потребления человеком за день"""

        if self.gender == "м":
            return self.Kf * (66.5 + 13.75 * self.weight +
                5.003 * self.height - 6.775 * self.age)
        elif self.gender == "ж":
            return self.Kf * (665.1 + 9.563 * self.weight +
                1.85 * self.height - 4.676 * self.age)

    def norNutr(self):
        """Расчет нормы нутриентов (жбу) в зависимости от цели"""

        REK_g, REK_b, REK_u = 0, 0, 0
        if self.mission == 1:
            # набор массы
            REK_g = round(self.rkkal * 0.30 / 9, 2)
            REK_b = round(self.rkkal * 0.35 / 4, 2)
            REK_u = round(self.rkkal * 0.55 / 4, 2)

        elif self.mission == 2:
            # сброс веса
            REK_g = round(self.rkkal * 0.10 / 9, 2)
            REK_b = round(self.rkkal * 0.30 / 4, 2)
            REK_u = round(self.rkkal * 0.60 / 4, 2)

        elif self.mission == 3:
            # поддержание веса
            REK_g = round(self.rkkal * 0.30 / 9, 2)
            REK_b = round(self.rkkal * 0.30 / 4, 2)
            REK_u = round(self.rkkal * 0.40 / 4, 2)

        return [REK_g, REK_b, REK_u]

    def summ_kkal(self):
        """Подсчет суммы калорий"""
        n = int(input("Введите кол-во продуктов: "))

        products = [Product() for p in range(n)]

        s = sum([p.kk for p in products])
        print("Сумма калорий = ", s)
        return s

    def rek(self):
        """Рекомендованное кол-во нутриентов и калорий в день"""
        g1, b1, u1 = self.norNutr()
        print(f"Рекомендованное кол-во ккал в день = {self.rkkal:.2f} гр.")
        print(f"Рекомендованное кол-во белков в день = {g1:.2f} гр.")
        print(f"Рекомендованное кол-во жиров в день = {b1:.2f} гр.")
        print(f"Рекомендованное кол-во углеводов в день = {u1:.2f} гр.")

    def optimal_KK(self):
        """Оптимальное распределение калорий между завтраком,
           обедом, ужином и перекусом"""
        okz = round(self.rkkal * 0.25, 2)
        oko = round(self.rkkal * 0.4, 2)
        oku = round(self.rkkal * 0.2, 2)
        okp = round(self.rkkal * 0.15, 2)
        return [okz, oko, oku, okp]

    def test_nutrition(self, param):
        """Проверка оптимальности количества калорий"""
        nutr_name = {0: "завтрак", 1: "обед", 2: "ужин", 3: "перекус"}
        nutr_delta = {0: 20, 1: 50, 2: 40, 3: 10}
        s = self.summ_kkal()
        optimal = self.optimal_KK()[param]
        name = nutr_name[param]
        delta = nutr_delta[param]

        if optimal - delta < s < optimal + delta:
            print(f"Оптимальное кол-во калорий на {name}")
        elif optimal - delta > s:
            print(f"Кол-во калорий НЕ оптимально для {name}а: "
                  f"необходимо увеличить калорийность {name}а")
        elif s > optimal + delta:
            print(f"Кол-во калорий НЕ оптимально для {name}а: "
                  f"необходимо уменьшить калорийность {name}а")


class Product:
    """Класс продукт"""

    def __init__(self):
        self.name = input("Введите название продукта: ")
        self.g = float(input("Введите кол-во жиров: "))
        self.b = float(input("Введите кол-во белков: "))
        self.u = float(input("Введите кол-во углеводов: "))
        self.k = float(input("Введите кол-во калорий: "))
        self.weight = float(input("Введите вес продукта (в гр.): "))
        self.gg = self.g * (self.weight / 100)
        self.bb = self.b * (self.weight / 100)
        self.uu = self.u * (self.weight / 100)
        self.kk = self.k * (self.weight / 100)

    def info(self):
        """Информация о продукте"""
        print(f"Кол-во жиров в {self.weight} гр. продукта = {self.gg:.2f}")
        print(f"Кол-во белков в {self.weight} гр. продукта = {self.bb:.2f}")
        print(f"Кол-во углеводов в {self.weight} гр. продукта = {self.uu:.2f}")
        print(f"Кол-во калорий в {self.weight} гр. продукта = {self.kk:.2f}")


class Menu():
    """ Класс меню """

    def __init__(self):
        self.n = Nutrition()

    def PrintMenu(self):
        print()
        print("_______________________М Е Н Ю_______________________")
        print(" 1 - узнать рекомендованное кол-во ЖБУ и ккал в день")
        print(" 2 - проверка калорийности завтрака на оптимальность ")
        print(" 3 - проверка калорийности обеда на оптимальность ")
        print(" 4 - проверка калорийности ужина на оптимальность ")
        print(" 5 - проверка калорийности перекуса на оптимальность ")
        print(" 6 - расчет ЖБУ и ккал на фактический вес продукта ")
        print(" 0 - ВЫХОД ")
        print()

        while (True):
            enter = int(input("Введите номер пункта меню : "))

            if enter == 1:
                print()
                self.n.rek()
                print()
            elif enter == 2:
                print()
                # 0 - завтрак
                self.n.test_nutrition(0),
                print()
            elif enter == 3:
                print()
                # 1 - обед
                self.n.test_nutrition(1),
                print()
            elif enter == 4:
                print()
                # 3 - ужин
                self.n.test_nutrition(2),
                print()
            elif enter == 5:
                print()
                # 4 - перекус
                self.n.test_nutrition(3),
                print()
            elif enter == 6:
                print()
                p = Product()
                p.info()
                print()
            elif enter == 0:
                exit()


menu = Menu()
menu.PrintMenu()
Я показала Ваш вариант меню преподавателю и вот что мне ответили:"Сейчас этот класс выродился в один метод и как класс он абсолютно бесполезен. Применять его можно только в этой Вашей программе и больше нигде. А класс представляет тип. Разные переменные этого типа (объекты класса) могут представлять меню для совершенно разных задач. Вам нужно сделать Menu классом, то есть убрать зависимость от конкретной задачи. Объект класса должен хранить массив (или список) строк - пунктов меню и для каждого пункта ссылку на функцию, которая вызывается если пользователь выбрал этот пункт меню. Конкретные строки (названия пунктов меню) и функции для этих пунктов передаются меню извне и для разных задач они будут разными."
Подскажите, пожалуйста, как реализовать меню именно в том виде, как описано? Благодарю за помощь.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Вам нужно сделать Menu классом, то есть убрать зависимость от конкретной задачи. Объект класса должен хранить массив (или список) строк - пунктов меню и для каждого пункта ссылку на функцию, которая вызывается если пользователь выбрал этот пункт меню. Конкретные строки (названия пунктов меню) и функции для этих пунктов передаются меню извне и для разных задач они будут разными.
Изначально в вашем вопросе таких требований не было, поэтому в примере выше я просто изменил ваш код так, чтобы он работал.
Подскажите, пожалуйста, как реализовать меню именно в том виде, как описано?
Как написано в задании - в классе меню должна быть переменная для хранения пунктов меню и ссылок на функции, которые должны вызываться при выборе каждого пункта.
Это можно реализовать например в виде словаря.
Заполняться словарь будет данными переданными в качестве аргумента при создании экземпляра класса меню.
Само меню будет выводится путем перебора пунктов из словаря.
Команды выполняться так: пользователь вводит пункт меню, который является ключом в словаре, программа ищет в словаре функцию по этому ключу и вызывает ее или выдает сообщение об ошибке если функции нет (выбран не верный пункт меню).
В качестве данных для меню будет передаваться класс, содержащий словарь определенной структуры.
Вот пример реализации:
Python:
class Nutrition:
    """класс питание"""

    def __init__(self):
        self.height = int(input("Введите ваш рост (в см): "))
        self.weight = int(input("Введите ваш вес (в кг): "))
        self.age = int(input("Введите ваш возраст: "))
        self.gender = input("Введите ваш пол (м/ж): ").lower()
        while self.gender not in ["м", "ж"]:
            print("Неправильно введён пол")
            self.gender = input("Введите ваш пол (м/ж): ").lower()
        self.Kf = float(input("Введите ваш коэффициент: "))
        self.mission = int(input("Введите номер цели (1, 2 или 3): "))
        while self.mission not in [1, 2, 3]:
            print("Неправильно введён номер цели ")
            self.mission = int(input("Введите номер цели (1, 2 или 3): "))
        self.rkkal = self.rKKal()

    def rKKal(self):
        """Рекомендованное количество ккал для потребления человеком за день"""

        if self.gender == "м":
            return self.Kf * (66.5 + 13.75 * self.weight +
                5.003 * self.height - 6.775 * self.age)
        elif self.gender == "ж":
            return self.Kf * (665.1 + 9.563 * self.weight +
                1.85 * self.height - 4.676 * self.age)

    def norNutr(self):
        """Расчет нормы нутриентов (жбу) в зависимости от цели"""

        REK_g, REK_b, REK_u = 0, 0, 0
        if self.mission == 1:
            # набор массы
            REK_g = round(self.rkkal * 0.30 / 9, 2)
            REK_b = round(self.rkkal * 0.35 / 4, 2)
            REK_u = round(self.rkkal * 0.55 / 4, 2)

        elif self.mission == 2:
            # сброс веса
            REK_g = round(self.rkkal * 0.10 / 9, 2)
            REK_b = round(self.rkkal * 0.30 / 4, 2)
            REK_u = round(self.rkkal * 0.60 / 4, 2)

        elif self.mission == 3:
            # поддержание веса
            REK_g = round(self.rkkal * 0.30 / 9, 2)
            REK_b = round(self.rkkal * 0.30 / 4, 2)
            REK_u = round(self.rkkal * 0.40 / 4, 2)

        return [REK_g, REK_b, REK_u]

    def summ_kkal(self):
        """Подсчет суммы калорий"""
        n = int(input("Введите кол-во продуктов: "))

        products = [Product() for p in range(n)]

        s = sum([p.kk for p in products])
        print("Сумма калорий = ", s)
        return s

    def rek(self):
        """Рекомендованное кол-во нутриентов и калорий в день"""
        g1, b1, u1 = self.norNutr()
        print(f"Рекомендованное кол-во ккал в день = {self.rkkal:.2f} гр.")
        print(f"Рекомендованное кол-во белков в день = {g1:.2f} гр.")
        print(f"Рекомендованное кол-во жиров в день = {b1:.2f} гр.")
        print(f"Рекомендованное кол-во углеводов в день = {u1:.2f} гр.")

    def optimal_KK(self):
        """Оптимальное распределение калорий между завтраком,
           обедом, ужином и перекусом"""
        okz = round(self.rkkal * 0.25, 2)
        oko = round(self.rkkal * 0.4, 2)
        oku = round(self.rkkal * 0.2, 2)
        okp = round(self.rkkal * 0.15, 2)
        return [okz, oko, oku, okp]

    def test_nutrition(self, param):
        """Проверка оптимальности количества калорий"""
        nutr_name = {0: "завтрак", 1: "обед", 2: "ужин", 3: "перекус"}
        nutr_delta = {0: 20, 1: 50, 2: 40, 3: 10}
        s = self.summ_kkal()
        optimal = self.optimal_KK()[param]
        name = nutr_name[param]
        delta = nutr_delta[param]

        if optimal - delta < s < optimal + delta:
            print(f"Оптимальное кол-во калорий на {name}")
        elif optimal - delta > s:
            print(f"Кол-во калорий НЕ оптимально для {name}а: "
                  f"необходимо увеличить калорийность {name}а")
        elif s > optimal + delta:
            print(f"Кол-во калорий НЕ оптимально для {name}а: "
                  f"необходимо уменьшить калорийность {name}а")

    def product_info(self):
        """Показать информацию о продукте"""
        p = Product()
        p.info()
        del(p)


class Product:
    """Класс продукт"""

    def __init__(self):
        self.name = input("Введите название продукта: ")
        self.g = float(input("Введите кол-во жиров: "))
        self.b = float(input("Введите кол-во белков: "))
        self.u = float(input("Введите кол-во углеводов: "))
        self.k = float(input("Введите кол-во калорий: "))
        self.weight = float(input("Введите вес продукта (в гр.): "))
        self.gg = self.g * (self.weight / 100)
        self.bb = self.b * (self.weight / 100)
        self.uu = self.u * (self.weight / 100)
        self.kk = self.k * (self.weight / 100)

    def info(self):
        """Информация о продукте"""
        print(f"Кол-во жиров в {self.weight} гр. продукта = {self.gg:.2f}")
        print(f"Кол-во белков в {self.weight} гр. продукта = {self.bb:.2f}")
        print(f"Кол-во углеводов в {self.weight} гр. продукта = {self.uu:.2f}")
        print(f"Кол-во калорий в {self.weight} гр. продукта = {self.kk:.2f}")


class Menu():
    """ Класс меню """

    def __init__(self, params):
        self.params = params
        self.commands = {
            "0": ("ВЫХОД", lambda: exit())
        }
        self.commands.update(self.params.commands)
        self.errors = {
            "0": ("", lambda: print("Неправильный пункт меню"))
        }

    def PrintMenu(self):
        while (True):
            print()
            print("_______________________М Е Н Ю_______________________")
            for k, v in self.commands.items():
                print(f"{k} - {v[0]}")
            print()
            enter = input("Введите номер пункта меню: ")
            print()
            self.commands.get(enter, self.errors["0"])[1]()
            print()


class Params():
    """Класс с данными для меню"""
    def __init__(self):
        self.n = Nutrition()

        self.commands = {
            "1": (
                "узнать рекомендованное кол-во ЖБУ и ккал в день",
                lambda: self.n.rek()
            ),
            "2": (
                "проверка калорийности завтрака на оптимальность",
                lambda: self.n.test_nutrition(0)
            ),
            "3": (
                "проверка калорийности обеда на оптимальность",
                lambda: self.n.test_nutrition(1)
            ),
            "4": (
                "проверка калорийности ужина на оптимальность",
                lambda: self.n.test_nutrition(2)
            ),
            "5": (
                "проверка калорийности перекуса на оптимальность",
                lambda: self.n.test_nutrition(3)
            ),
            "6": (
                "расчет ЖБУ и ккал на фактический вес продукта",
                lambda: self.n.product_info()
            )
        }
      
      
p = Params()  # экземпляр класса с данными для меню
menu = Menu(p)  # экземпляр класса меню
menu.PrintMenu()  # вывод меню в консоль
 
Последнее редактирование:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Класс меню можно использовать для формирования меню для любых функций.
Для этого нужно только передать в него правильно сформированный класс с данными.
Вот пример использования класса меню для работы с классом простого калькулятора:
Python:
class Menu():
    """ Класс меню """

    def __init__(self, params):
        self.params = params
        self.commands = {
            "0": ("ВЫХОД", lambda: exit())
        }
        self.commands.update(self.params.commands)
        self.errors = {
            "0": ("", lambda: print("Неправильный пункт меню"))
        }

    def PrintMenu(self):
        while (True):
            print()
            print("_______________________М Е Н Ю_______________________")
            for k, v in self.commands.items():
                print(f"{k} - {v[0]}")
            print()
            enter = input("Введите номер пункта меню: ")
            print()
            self.commands.get(enter, self.errors["0"])[1]()
            print()
    
    
class Calc():
    """Класс калькулятор"""

    def add(self):
        a = float(input("Введите первое число: "))
        b = float(input("Введите второе число: "))
        print("Сумма чисел равна:", a + b)

    def sub(self):
        a = float(input("Введите первое число: "))
        b = float(input("Введите второе число: "))
        print("Разность чисел равна:", a - b)

    def mul(self):
        a = float(input("Введите первое число: "))
        b = float(input("Введите второе число: "))
        print("Произведение чисел равно:", a * b)
        

class Params():
    """Класс с данными для меню"""
    def __init__(self):
        self.c = Calc()

        self.commands = {
            "1": (
                "узнать сумму введенных чисел ",
                lambda: self.c.add()
            ),
            "2": (
                "узнать разность введенных чисел ",
                lambda: self.c.sub()
            ),
            "3": (
                "узнать произведение введенных чисел ",
                lambda: self.c.mul()
            )
        }
        
p = Params()  # экземпляр класса с данными для меню
menu = Menu(p)  # экземпляр класса меню
menu.PrintMenu()  # вывод меню в консоль

Также в качестве данных можно передать класс содержащий пустой словарь - в этом случае получится меню с одним пунктом (0 - Выход).
Python:
class Params():
    """Класс данных с пустым словарем"""
    def __init__(self):
        self.commands = {}
 
  • Мне нравится
Реакции: Ника

Ника

Новичок
Пользователь
Окт 17, 2020
26
0
1
Класс меню можно использовать для формирования меню для любых функций.
Для этого нужно только передать в него правильно сформированный класс с данными.
Вот пример использования класса меню для работы с классом простого калькулятора:
Python:
class Menu():
    """ Класс меню """

    def __init__(self, params):
        self.params = params
        self.commands = {
            "0": ("ВЫХОД", lambda: exit())
        }
        self.commands.update(self.params.commands)
        self.errors = {
            "0": ("", lambda: print("Неправильный пункт меню"))
        }

    def PrintMenu(self):
        while (True):
            print()
            print("_______________________М Е Н Ю_______________________")
            for k, v in self.commands.items():
                print(f"{k} - {v[0]}")
            print()
            enter = input("Введите номер пункта меню: ")
            print()
            self.commands.get(enter, self.errors["0"])[1]()
            print()
   
   
class Calc():
    """Класс калькулятор"""

    def add(self):
        a = float(input("Введите первое число: "))
        b = float(input("Введите второе число: "))
        print("Сумма чисел равна:", a + b)

    def sub(self):
        a = float(input("Введите первое число: "))
        b = float(input("Введите второе число: "))
        print("Разность чисел равна:", a - b)

    def mul(self):
        a = float(input("Введите первое число: "))
        b = float(input("Введите второе число: "))
        print("Произведение чисел равно:", a * b)
       

class Params():
    """Класс с данными для меню"""
    def __init__(self):
        self.c = Calc()

        self.commands = {
            "1": (
                "узнать сумму введенных чисел ",
                lambda: self.c.add()
            ),
            "2": (
                "узнать разность введенных чисел ",
                lambda: self.c.sub()
            ),
            "3": (
                "узнать произведение введенных чисел ",
                lambda: self.c.mul()
            )
        }
       
p = Params()  # экземпляр класса с данными для меню
menu = Menu(p)  # экземпляр класса меню
menu.PrintMenu()  # вывод меню в консоль

Также в качестве данных можно передать класс содержащий пустой словарь - в этом случае получится меню с одним пунктом (0 - Выход).
Python:
class Params():
    """Класс данных с пустым словарем"""
    def __init__(self):
        self.commands = {}
Спасибо огромное!
 

Ника

Новичок
Пользователь
Окт 17, 2020
26
0
1
Спасибо огромное!
Здравствуйте! Простите, пожалуйста, за надоедливость) Но не подскажете, как называется конструкция, с помощью которой создано меню для калькулятора? Я имею в виду именно соответствие номеру пункта меню и метода.
 

Форум IT Специалистов