Python

Помогите пожалуйста с задачей по python!

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

Каждый день вызывается специальная функция one_day(), которая возвращает количество кармы от 1 до 7 и может с вероятностью 1 к 10 выкинуть одно из исключений:

KillError
DrunkError
CarCrashError
GluttonyError
DepressionError
Напишите такую программу. Функцию оберните в бесконечный цикл, выход из которого возможен только при накоплении кармы до уровня константы. Исключения обработайте и запишите в отдельный лог karma.log.
Wadim Minnichazeev
Wadim Minnichazeev
58
Рауан Садекбаев
Рауан Садекбаев
34 935
Лучший ответ
Wadim Minnichazeev Спасибо большое!
Это же задача из ООП. Думаю решение a Vitness (правильное кстати) завернули заявив что надо всё в в стиле ООП сделать.

Так правильнее.
Руслан Чернега Там ещё документацию надо дописать. Это уже сами сможете.
Doni Toolos Насколько я понимаю, это не совсем верное решение. Смысл ООП заложен как раз в исключениях и их обработке. В данном варианте решения не выводятся исключения. А лишь элементы списка....
Руслан Чернега Причём тут исключения?)
ООП это работа с классами и другими объектами. В питоне всё объекты и ООП это работа с ними.
Исключения это исключения.
Doni Toolos а при том, что надо создавать не класс буддиста, а классы исключений. Знаток ;)
Руслан Чернега НЕзнаток. Задачка дана чтоб определить понял ты как с классом работать или нет. Исключений тут даже нет, вместо них абра-кадабра.
То что ты не умеешь приоритеты расставлять и трудности устраиваешь на ровном месте не значит что это надо всем показывать.
Руслан Чернега Мой ответ приняли.
Это значит ты придумал себе лишнюю работу. С чем тебя и поздравляю.
 import random 

ENLIGHTENMENT_CARMA_LEVEL = 500


class IamGodError(Exception):
pass


class DrunkError(Exception):
pass


class CarCrashError(Exception):
pass


class GluttonyError(Exception):
pass


class DepressionError(Exception):
pass


class SuicideError(Exception):
pass


def one_day():
day = 0
total_carma = 0
while total_carma < ENLIGHTENMENT_CARMA_LEVEL:
day += 1

if random.randint(1, 10) == 1:
dice = random.choice(['IamGodError', 'DrunkError', 'CarCrashError',
'GluttonyError', 'DepressionError', 'SuicideError'])
with open('karma.log', 'a', encoding='utf-8') as file:
file.write(f'День: {day} Исключение: {dice}\n')
try:
if dice == 'IamGodError':
raise IamGodError
if dice == 'DrunkError':
raise DrunkError
if dice == 'CarCrashError':
raise CarCrashError
if dice == 'GluttonyError':
raise GluttonyError
if dice == 'DepressionError':
raise DepressionError
if dice == 'SuicideError':
raise SuicideError

except IamGodError:
print(f'День: {day} Исключение: {dice}')
except DrunkError:
print(f'День: {day} Исключение: {dice}')
except CarCrashError:
print(f'День: {day} Исключение: {dice}')
except GluttonyError:
print(f'День: {day} Исключение: {dice}')
except DepressionError:
print(f'День: {day} Исключение: {dice}')
except SuicideError:
print(f'День: {day} Исключение: {dice}')

else:
carma = random.randint(1, 7)
total_carma += carma
print(f'День: {day} Выпало кармы: {carma} Всего кармы: {total_carma}')

one_day()
Ablay Koynrad Код хороший, только ошибка в множественным if. Так как если проверка закончится на первом if, то проверка все равно продолжится, стоит заменить конструкцию на if, elif, elif, elif...... else
Ablay Koynrad А так же карму лучше всего передавать в функцию и создать переменную после написания функции, либо создать её внутри самой функции def one_day():
выкинуть одно из ИСКЛЮЧЕНИЙ:

KillError
DrunkError
CarCrashError
GluttonyError
DepressionError

ИСКЛЮЧЕНИЯ ОБРАБОТАЙТЕ и запишите в отдельный лог karma.log

Ты умеешь читать задания?
Из этой "абры-кадабры", как ты выражаешься, нужно сделать классы исключений наследованием. В этом и есть смысл задания на ООП.

А про буддиста не написано, что надо делать класс. Хочешь - делай, не хочешь - не делай. Но твое решение не соответствует заданию.

В решении должно быть:
class KillError(Exception):
pass
и так далее.....
Подсказка Знатоку от Незнатока ;)
Azamat Kudaibergen
Azamat Kudaibergen
292
Виктор Шварц Подскажите, пожалуйста, как при этом вызывать случайное исключение?
Конструкция:
random.choice([KillError(), DrunkError(), CarCrashError(), GuttonyError(), DepressionError()])
не работает, не знаю почему.
Azamat Kudaibergen Названия исключений в random.choise сделай без скобок.
И выбранное исключение в raise
import random


class KillError(Exception):
pass


class DrunkError(Exception):
pass


class CarCrashError(Exception):
pass


class GluttonyError(Exception):
pass


class DepressionError(Exception):
pass


karma = 0
with open('log.txt', 'w') as log:
while karma < 500:
random.choice([DepressionError, GluttonyError, CarCrashError, KillError, DrunkError])
try:
prob = random.randint(0, 10)
if prob == 7:
raise Exception()
else:
karma += random.randint(1, 7)
print(f'кармы накоплено {karma}')
except Exception as ex:
log.write(str(random.choice([DepressionError, GluttonyError, CarCrashError, KillError, DrunkError])) + '\n')
print('Намасте')
import random


class KarmaError(Exception):
pass


class KillError(KarmaError):
def __str__(self):
return f'KillError'


class DrunkError(KarmaError):
def __str__(self):
return f'DrunkError'


class CarCrashError(KarmaError):
def __str__(self):
return f'CarCrashError'


class GluttonyError(KarmaError):
def __str__(self):
return f'GluttonyError'


class DepressionError(KarmaError):
def __str__(self):
return f'DepressionError'


class Buddhist:
def __init__(self, karma=0):
self.karma = karma

def get_karma(self):
return self.karma

def set_karma(self, karma):
self.karma += karma


def one_day():
choice = random.randint(1, 10)
if choice == 1:
error = random.choice([KillError, DrunkError, CarCrashError, GluttonyError, DepressionError])
try:
raise error
except KarmaError as err:
# print(f'День: {day} Исключение: {str(err)}')
with open('karma.log', 'a', encoding='utf-8') as file:
file.write(f'День: {day} Исключение: {str(err)}\n')
else:
return random.randint(1, 7)


buddhist = Buddhist()
day = 0
while buddhist.get_karma() < 500:
day += 1
result = one_day()
if not isinstance(result, int):
pass
else:
buddhist.set_karma(result)
я так сделал
 import random 


class BuddhistProgrammer:
"""
Класс для программиста-буддиста.

Attributes:
__CONSTANT_KARMA_POINTS (int): константа, представляющая количество очков кармы,
назначенных буддийскому программисту, со значением по умолчанию 500.

karma (int): Текущие очки кармы буддийского программиста.
"""
__CONSTANT_KARMA_POINTS = 500

def __init__(self):
self.karma = 0

def get_constant_karma_points(self):
"""
Возвращает значение константы очков кармы.

:return: Значение константы очков кармы
:rtype: int
"""
return self.__CONSTANT_KARMA_POINTS


class CustomError(Exception):
"""Базовый класс пользовательских исключений."""

def __init__(self, *args):
self.message = args[0] if args else None

def __str__(self):
return self.message


class KillError(CustomError):
"""Класс пользовательского исключения, вызываемого при возникновении ошибки процесса уничтожения."""

def __init__(self):
self.message = 'Произошла ошибка при попытке уничтожить процесс.'


class DrunkError(CustomError):
"""Класс пользовательского исключения, вызываемого при возникновении ошибки из-за пьяного состояния."""

def __init__(self):
self.message = 'Пожалуйста, выполните действие в трезвом состоянии.'


class CarCrashError(CustomError):
"""Класс пользовательского исключения, вызываемого при возникновении ошибки автомобильной аварии."""

def __init__(self):
self.message = 'Автомобиль выехал за пределы дороги и врезался в дерево.'


class GluttonyError(CustomError):
"""Класс пользовательского исключения, вызываемого при возникновении ошибки из-за обжорства."""

def __init__(self):
self.message = 'Произошла ошибка из-за обжорства.'


class DepressionError(CustomError):
"""Класс пользовательского исключения, вызываемого при возникновении ошибки депрессии."""

def __init__(self):
self.message = 'Ошибка валидации данных: обнаружены признаки депрессии у пользователя.'


def choice_random_exception():
"""
Случайным образом выбирает из списка класс пользовательского исключения,
создает и возвращает объект(экземпляр) выбранного класса исключения.

:return: Экземпляр случайно выбранного класса исключения.
:rtype: object
"""
error_classes = [KillError, DrunkError, CarCrashError, GluttonyError, DepressionError]
random_error_class = random.choice(error_classes)
return random_error_class()


def one_day(count_day):
"""
Имитирует день и логирует в файл возникающие исключения.

Parameters:
count_day (int): Количество прошедших дней

:return: Случайное целое число от 1 до 7
:rtype: int
"""
if random.randint(1, 10) == 1:
with open('karma.log', 'a', encoding='utf-8') as karma_log:
error_instance = choice_random_exception()
try:
raise error_instance
except CustomError as e:
karma_log.write(f'День {count_day}. Исключение: {type(e).__name__}. {str(e)}\n')
return random.randint(1, 7)
Талгат Багытжанов buddhist_programmer = BuddhistProgrammer()

day = 0
while buddhist_programmer.karma < buddhist_programmer.get_constant_karma_points():
day += 1
random_amount_of_karma = one_day(day)
if buddhist_programmer.karma + random_amount_of_karma > buddhist_programmer.get_constant_karma_points():
random_amount_of_karma = buddhist_programmer.get_constant_karma_points() - buddhist_programmer.karma
buddhist_programmer.karma += random_amount_of_karma

print(f'Спустя {day} дней, было набрано {buddhist_programmer.karma} очков кармы.\n'
f'Было достигнуто состояние просветления, которое освободило от страдания и цикла перерождений.')
Талгат Багытжанов
 buddhist_programmer = BuddhistProgrammer()  

day = 0
while buddhist_programmer.karma < buddhist_programmer.get_constant_karma_points():
day += 1
random_amount_of_karma = one_day(day)
if buddhist_programmer.karma + random_amount_of_karma > buddhist_programmer.get_constant_karma_points():
random_amount_of_karma = buddhist_programmer.get_constant_karma_points() - buddhist_programmer.karma
buddhist_programmer.karma += random_amount_of_karma

print(f'Спустя {day} дней, было набрано {buddhist_programmer.karma} очков кармы.\n'
f'Было достигнуто состояние просветления, которое освободило от страдания и цикла перерождений.')
Талгат Багытжанов Не уместилось в сообщении)
class KillError(Exception):
def __str__(self):
return 'KillError'

class DrunkError(Exception):
def __str__(self):
return 'DrunkError'

class CarCrashError(Exception):
def __str__(self):
return 'CarCrashError'

class GluttonyError(Exception):
def __str__(self):
return 'GluttonyError'

class DepressionError(Exception):
def __str__(self):
return 'DepressionError'


def one_day():
karma = 0
day = 0
while karma <= 500:
day += 1
karma += random.randint(1, 7)
print(f'День: {day} набрано кармы: {karma}')
with open('karma.log', 'a', encoding='utf-8') as log:
offence = random.choice([KillError(), DrunkError(), CarCrashError(),
GluttonyError(), DepressionError()])
try:
if random.randint(0, 10) == 3:
raise offence
except Exception as offence:
log.write(f'День: {day} проступок - {str(offence)}\n')


one_day()