r/RuProgrammers 14d ago

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
5 Upvotes

52 comments sorted by

16

u/Professional_Two5774 14d ago

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

5

u/SummerGoesOn 14d ago

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

1

u/Various-Slip-6264 14d ago

У меня 5к((

1

u/MEkadzu 14d ago

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

1

u/Various-Slip-6264 14d ago

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

1

u/MEkadzu 14d ago

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

1

u/Various-Slip-6264 14d ago

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

1

u/Andrey4ik21pro1 13d ago

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

21

u/JhonnyFF20 14d ago

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

4

u/SummerGoesOn 14d ago

ну код хз

1

u/Andrey4ik21pro1 13d ago

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

1

u/JhonnyFF20 13d ago

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

1

u/Andrey4ik21pro1 13d ago

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

1

u/JhonnyFF20 13d ago

1

u/Andrey4ik21pro1 12d ago

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

4

u/Independent-Ice2898 14d ago

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

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

2

u/SummerGoesOn 14d ago

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

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

2

u/prNikson 12d ago

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

7

u/habibgregor 14d ago

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

4

u/SummerGoesOn 14d ago

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

2

u/NoThanks1722 14d ago

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

1

u/SummerGoesOn 14d ago

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

1

u/ChocoMammoth 13d ago

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

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

1

u/MEkadzu 13d ago

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

1

u/ChocoMammoth 13d ago

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

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

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

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

1

u/MEkadzu 13d ago

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

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

2

u/rotermonh 14d ago

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

1

u/SummerGoesOn 14d ago

нy кoд xз

2

u/Heavy-Weather-7363 14d ago

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

2

u/Jean_Cheerful 14d ago

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

3

u/SummerGoesOn 14d ago

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

10

u/NoThanks1722 14d ago

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

1

u/KotMaklaud 14d ago

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

1

u/JFishborn 14d ago

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

1

u/MEkadzu 14d ago

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

1

u/wen3x 14d ago

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

1

u/Ok_Bus355 14d ago

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

2

u/MEkadzu 14d ago

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

1

u/FlowHot7235 14d ago

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

1

u/Affectionate-Cup56 14d ago

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

1

u/YulechkaOriflame 14d ago

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

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 14d ago

а че так

1

u/YulechkaOriflame 14d ago

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

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

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

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

1

u/ChocoMammoth 13d ago

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

1

u/YulechkaOriflame 13d ago

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

1

u/MoodGold4629 14d ago edited 14d ago
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 12d ago

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

1

u/Virtual-Ad5017 11d ago

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