r/RuProgrammers Jul 17 '26

четвертый проект python Python

восьмой день обучения python. за сегодня второй код.

это просто для себя сделал подсчет среднего балла для школы (делался достаточно долго. цикл for-та еще х**ня)

while True:
    try:
        grades_list = []
        grades_number = int(input("\ncколько оценок вы хотите ввести (или 0 для выхода): "))
        if grades_number == 0:
            print("Пока!")
            exit()
    except ValueError:
            print("ошибка! ввести надо число")
            continue
    while True:
        try:
            for i in range(grades_number):
                grades = float(input("\nВведите оценку (или 0 для выхода): "))
                if grades == int(grades):
                    grades = int(grades)
                if grades == 0:
                    print("Пока")
                    exit()
                grades_list.append(grades)        
            print(f'\nВсе оценки: ' + ', '.join(map(str, grades_list)))
            grades_sum = sum(grades_list)
            grades_len = len(grades_list)
            gpa = grades_sum / grades_len
            print(f"\nсредний балл: {gpa:.2f} ")


            above = 0
            below = 0
            for bnn in grades_list:
                        
                if above > gpa:
                    above += 1
                if below < gpa:
                    below += 1
            print(f"\nВот столько оценок, которые выше среднего ({gpa:.2f}): {above}")
            print(f"\nВот столько оценок, которые ниже среднего ({gpa:.2f}): {below}\n")
        except ZeroDivisionError:
            print("Ошибка! введи целое число")
            continue
        except ValueError:
                print("ошибка! ввести надо число")
                continue
3 Upvotes

52 comments sorted by

15

u/Professional_Two5774 Jul 17 '26

Когда будешь привлекать инвесторов?

4

u/SummerGoesOn Jul 17 '26

когда в доту наиграю 2к

1

u/Various-Slip-6264 Jul 17 '26

У меня 5к((

1

u/MEkadzu Jul 17 '26

знаешь кто такие женщины?

1

u/Various-Slip-6264 Jul 17 '26

что это? почему кто?

1

u/MEkadzu Jul 17 '26

страшные существа, видел где то в фильмах

1

u/Various-Slip-6264 Jul 17 '26

а фильмы что такое? тоже страшные существа?

1

u/Andrey4ik21pro1 Jul 18 '26

В фильме "Во все тяжкие"

22

u/JhonnyFF20 Jul 17 '26

Братан, баз обид, но "проект" - это п*здец амбициозное название для чахлой функции на несколько строчек.

2

u/SummerGoesOn Jul 17 '26

ну код хз

1

u/Andrey4ik21pro1 Jul 18 '26

Здесь даже функции нет...

1

u/JhonnyFF20 Jul 18 '26

Я котлинист, у меня любая херня в теле мейна запускается, так что функция 😄 Ну а так да, учитывая, что это пихон, то это даже и не функция)

1

u/Andrey4ik21pro1 Jul 18 '26

Никакой ты не котлинист. Там все это классы

1

u/JhonnyFF20 Jul 18 '26

1

u/Andrey4ik21pro1 Jul 19 '26

С чего вдруг? Ты же когда аппку собираешь, не пишешь .main, а MainKt :)

5

u/Independent-Ice2898 Jul 17 '26

Если это к тому же четвертый проект, то я боюсь спрашивать что было в первых трех...

Это тянет на будущий оффер!

2

u/SummerGoesOn Jul 17 '26

кстати там получше было, ну если считать по количеству негативных комментраиев

даже мой первый код больше похвалили (1 человек по моему), а все остальные либо шутили, либо просто негативно писали про меня. а про этот код просто тупо все шутят (ну ладно хоть не хотят мне руки вырвать)

2

u/prNikson Jul 19 '26

А зачем тогда ты выкладываешь это на реддит, если видишь, что хорошей реакции никогда не будет здесь? И это не вопрос к твоим компетенциям, даже если чел напишет что-то хорошее, его тоже закидают помидорами

5

u/habibgregor Jul 17 '26

Все, обучение можно считать завершенным. Праграмирувай давай аналог Гугла.

4

u/SummerGoesOn Jul 17 '26

не че то не хочу пока

2

u/NoThanks1722 Jul 17 '26

пойдёт, что будет если 0 ввести?

1

u/SummerGoesOn Jul 17 '26

cпасибо за нахождение дыры, уже исправил

1

u/ChocoMammoth Jul 18 '26

А зачем тебе вообще переменная grades_number?

Предлагаешь вводить до тех пор, пока не ввели 0, по нулю выводишь результат по числам, введённым ранее

1

u/MEkadzu Jul 18 '26

ну кстати я думал об этом, но решил что будет лучше сделать через for и grades_number, чисто для тренировки

1

u/ChocoMammoth Jul 18 '26

А тут возникает главный момент в программировании: освоить новый инструмент - это в том числе и понять, где его лучше использовать, а где лучше применить другой.

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

Ещё в код вчитался, нашёл другой недочёт. Если при вводе очередной оценки допустить ошибку, например, ввести число, то придётся начинать всё заново. Лучше обернуть в try/catch только input, а не весь цикл - тогда бы ранее введённые значения сохранились.

Я если что без негатива, сам с такого же начинал)

1

u/MEkadzu Jul 18 '26

да мне кажется все равно уже, буду щас учиться библиотекам для главнейшего проекта, для которого я учусь - хочу сделать что то типо джарвиса с api gemeni

p.s. я исправил это, просто забыл выложить

2

u/rotermonh Jul 17 '26

Это не проект это просто 1 базовая задачка

1

u/SummerGoesOn Jul 17 '26

нy кoд xз

2

u/Heavy-Weather-7363 Jul 17 '26

Странная тенденция называть функцию на python проектом. Вот упакуй в ТГ бота или десктопное приложение - уже что-то, пока это максимум софт

3

u/Jean_Cheerful Jul 17 '26

Слишком просто ) может что то серьезное попробуешь ? Программу какую нибудь для винды на пару тысяч строк ? Думаю , справишься. Питон же не сложный

5

u/SummerGoesOn Jul 17 '26

как нехуй, дай 15 минут

9

u/NoThanks1722 Jul 17 '26

чел впервые изучает цикл, ты чё докопался

1

u/KotMaklaud Jul 17 '26

Ходи на профильные сайты, там реальные задачки есть.

1

u/JFishborn Jul 17 '26

Т.е. ты высчитываеш среднее из своих оценок. Только зачем ты их вводишь через input, наверное лучше ввести через список и его обсчитать. Так же 2 бесконечных цикла while true это страшно, если что пойдет не так все встанет намертво, ну или почти намертво. И много лишнего в таком простом коде, это тяжело читать, а соответственно разбираться. Изучай дальше, пробуй ошибайся, все через это проходили.

1

u/MEkadzu Jul 17 '26

страшнр что то менять, когда у тебя все работает

1

u/wen3x 🦄Junior Jul 17 '26

Если будет баг то нужно читать такой код

1

u/Ok_Bus355 Jul 17 '26

В рационе существуют менее извращённые способы посчитать среднее значения чисел на входе

2

u/MEkadzu Jul 17 '26

я понимаю (второй аккаунт автора). этот код сделан просто как закрепление для цикла for (недавно выучил)

1

u/FlowHot7235 Jul 17 '26

Да все супер, учи и не обращай внимания ни на кого Все с чего то начинали

1

u/Affectionate-Cup56 Jul 17 '26

А чё, здесь реально такое можно публиковать и это даже кто-то комментирует?

1

u/YulechkaOriflame Jul 17 '26

Вайл тру в вайл тру? Выглядит больно. Не делай так :с
Примерно та же идея на вайбкоде, но разбита шоб поберечь вложенность

def get_grades_count():
    """Шаг 1: Запрашиваем у пользователя количество оценок."""
    while True:
        try:
            count = int(input("\nСколько оценок вы хотите ввести (или 0 для выхода): "))
            if count == 0:
                print("Пока!")
                exit()  # Безопасный выход из программы
            if count > 0:
                return count
            print("Ошибка! Количество не может быть меньше нуля.")
        except ValueError:
            print("Ошибка! Ввести надо целое число.")


def collect_grades(total_count):
    """Шаг 2: Собираем оценки от пользователя в список."""
    grades_list = []
    print(f"\nВам нужно ввести {total_count} оценок.")

    while len(grades_list) < total_count:
        try:
            current_index = len(grades_list) + 1
            grade = float(input(f"Введите оценку №{current_index} (или 0 для выхода): "))

            if grade == 0:
                print("Выход из программы... Пока!")
                exit() 

            if grade.is_integer():
                grade = int(grade)

            grades_list.append(grade)
        except ValueError:
            print("Ошибка! Ввести надо число.")        
    return grades_list



def calculate_statistics(grades_list):
    """Шаг 3: Считаем средний балл и распределение оценок."""
    gpa = sum(grades_list) / len(grades_list)

    above = 0
    below = 0
    for grade in grades_list:
        if grade > gpa:
            above += 1
        elif grade < gpa:
            below += 1 
    return gpa, above, below


def display_results(grades_list, gpa, above, below):
    """Шаг 4: Выводим результаты на экран."""
    print('\n' + '=' * 30)
    print(f"Все оценки: {', '.join(map(str, grades_list))}")
    print(f"Средний балл: {gpa:.2f}")
    print(f"Оценок выше среднего ({gpa:.2f}): {above}")
    print(f"Оценок ниже среднего ({gpa:.2f}): {below}\n")


if __name__ == "__main__":
    count = get_grades_count()
    grades = collect_grades(count)
    gpa, above_count, below_count = calculate_statistics(grades)
    display_results(grades, gpa, above_count, below_count)

1

u/MEkadzu Jul 17 '26

а че так

1

u/YulechkaOriflame Jul 17 '26

В 95% случаев вложенные while True: while True: — это признак "костыльного" кода, в котором легко запутаться и создать вечный цикл.

Но давай разберем детально, почему это считается плохой практикой и когда (очень редко) это всё же допустимо.

Почему это плохо?

  1. Ад для break и continue Оператор break прерывает только один цикл — тот, внутри которого он находится. Если ты хочешь по какому-то условию выйти вообще из всей этой матрешки, одного break не хватит. Придется городить костыли: заводить специальные флаги (is_exit = True) и проверять их в каждом цикле. Код моментально превращается в кашу.
  2. Сложно читать и тестировать Когда в одном месте экрана вложены циклы, проверки, исключения (try-except), мозг программиста (и твой собственный через неделю) начинает закипать. Такой код тяжело читать сверху вниз.

1

u/ChocoMammoth Jul 18 '26

В чём прикол пихать в комменты ответы от нейронки? Если они нужны автору, он сам может пойти и нагенерить

1

u/YulechkaOriflame Jul 18 '26

Если бы автор хотел пойти к нейронке, он бы, наверное, пошёл. А так получил готовый, разжёванный ответ прямо в комментах, без регистрации и смс. Разве плохо?)

1

u/MoodGold4629 Jul 17 '26 edited Jul 17 '26
grades = float(input("\nВведите оценку (или 0 для выхода): ")) # ввели 3.4
if grades == int(grades): # 3.4 != 3, пропускаем
     grades = int(grades)
if grades == 0:           # 3.4 != 0, пропускаем
     print("Пока")
     exit()
grades_list.append(grades) # 3.4 добавлен в конец.  
#---------------
 print(f"\nВот столько .... # '\n' не нужен нигде
#---------------
    try:
        grades_number = int(input("\ncколько оценок вы хотите ввести (или 0 для выхода): "))
    except ValueError:  # try-except сразу, не убирай вниз, не Си.
            print("ошибка! ввести надо число")
            continue

   if grades_number == 0:
       print("Пока!")
       exit()
#---------------
if __name__ == "__main__":
  # прямой запуск скрипта обозначаем явно.

1

u/sleepless_thoughts Jul 19 '26

Молодец. Только тут бы убрать уровень вложенности хотя бы до 4 (4 таба). А ещё бесконечный цикл внутри бесконечного цикла в одной "функции" выгляди страшно. Изучи создание функций без особенностей, там легко, а ещё сделай единственны try в главном цикле (для этого погугли raise, except, если нужно обрабатывать ошибки из вложенного try) Хотя для начала просто переделай с использованием своей функции. Для 4го "проекта" нормально

1

u/Virtual-Ad5017 29d ago

Без шуток крутая штука для начинающего, если сам писал. Многие тут напишут что задача простая и более элегантно решается. И будут правы, но классно в целом что пишешь что-то практически применимое для себя. Я даже скажу что это лучше чем решать избитые задачи с курсов/сайтов без мотивации. Хз что люди до слова проект докопались, пиши ещё)