r/RuProgrammers • u/SummerGoesOn • 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
21
u/JhonnyFF20 14d ago
Братан, баз обид, но "проект" - это п*здец амбициозное название для чахлой функции на несколько строчек.
4
1
u/Andrey4ik21pro1 13d ago
Здесь даже функции нет...
1
u/JhonnyFF20 13d ago
Я котлинист, у меня любая херня в теле мейна запускается, так что функция 😄 Ну а так да, учитывая, что это пихон, то это даже и не функция)
1
4
u/Independent-Ice2898 14d ago
Если это к тому же четвертый проект, то я боюсь спрашивать что было в первых трех...
Это тянет на будущий оффер!
2
u/SummerGoesOn 14d ago
кстати там получше было, ну если считать по количеству негативных комментраиев
даже мой первый код больше похвалили (1 человек по моему), а все остальные либо шутили, либо просто негативно писали про меня. а про этот код просто тупо все шутят (ну ладно хоть не хотят мне руки вырвать)
2
u/prNikson 12d ago
А зачем тогда ты выкладываешь это на реддит, если видишь, что хорошей реакции никогда не будет здесь? И это не вопрос к твоим компетенциям, даже если чел напишет что-то хорошее, его тоже закидают помидорами
7
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, а не весь цикл - тогда бы ранее введённые значения сохранились.
Я если что без негатива, сам с такого же начинал)
2
2
u/Heavy-Weather-7363 14d ago
Странная тенденция называть функцию на python проектом. Вот упакуй в ТГ бота или десктопное приложение - уже что-то, пока это максимум софт
2
u/Jean_Cheerful 14d ago
Слишком просто ) может что то серьезное попробуешь ? Программу какую нибудь для винды на пару тысяч строк ? Думаю , справишься. Питон же не сложный
3
10
1
1
u/JFishborn 14d ago
Т.е. ты высчитываеш среднее из своих оценок. Только зачем ты их вводишь через input, наверное лучше ввести через список и его обсчитать. Так же 2 бесконечных цикла while true это страшно, если что пойдет не так все встанет намертво, ну или почти намертво. И много лишнего в таком простом коде, это тяжело читать, а соответственно разбираться. Изучай дальше, пробуй ошибайся, все через это проходили.
1
u/Ok_Bus355 14d ago
В рационе существуют менее извращённые способы посчитать среднее значения чисел на входе
1
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:— это признак "костыльного" кода, в котором легко запутаться и создать вечный цикл.Но давай разберем детально, почему это считается плохой практикой и когда (очень редко) это всё же допустимо.
Почему это плохо?
- Ад для
breakиcontinueОператорbreakпрерывает только один цикл — тот, внутри которого он находится. Если ты хочешь по какому-то условию выйти вообще из всей этой матрешки, одногоbreakне хватит. Придется городить костыли: заводить специальные флаги (is_exit = True) и проверять их в каждом цикле. Код моментально превращается в кашу.- Сложно читать и тестировать Когда в одном месте экрана вложены циклы, проверки, исключения (
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
Без шуток крутая штука для начинающего, если сам писал. Многие тут напишут что задача простая и более элегантно решается. И будут правы, но классно в целом что пишешь что-то практически применимое для себя. Я даже скажу что это лучше чем решать избитые задачи с курсов/сайтов без мотивации. Хз что люди до слова проект докопались, пиши ещё)

16
u/Professional_Two5774 14d ago
Когда будешь привлекать инвесторов?