MyNameIsDice
@MyNameIsDice

Существуют ли более приятные конструкции чем if elif else где на каждое значение нужно проводить разное действие?

Мне не очень нравится как выглядит исполнение такого рода кода, где есть значение и в зависимости какое это значение нужно выполнить определённое действие. Хотелось бы узнать есть ли конструкции более эффективные или же более понятные чем те что использую я. Ниже пример, отрывок из класса.

def gamble(self):
dice = randint(1,6)
if dice == 1:
self.pass_day()
elif dice == 2:
self.eat_food()
elif dice == 3:
self.work_day()
elif dice == 4:
self.have_fun()
elif dice == 5:
self.go_shopping()
else:
self.sleep()
  • Вопрос задан
  • 135 просмотров
Решения вопроса 1
@twistfire92
Python backend developer
Во-первых код надо оборачивать в соответствующий тег.

По вашему вопросу. В питоне как такового нет оператора case, как во многих других языках. Но из-за того, что все в питоне является объектами, даже функции, то можно провернуть все через словарь

# прописываем соответсвие значений кубика и действий через словарь
actions = {1: self.pass_day,
			2: self.eat_food,
			3: self.work_day,
			4: self.have_fun,
			5: self.go_shopping,
			6: self.sleep}

action = actions[dice] # получаем нужную функцию

action() # Выполняем нужную функцию


Заметьте, что в словаре прописываем имена функций без (), т.к. мы не выполняем их, а только ссылаемся на сами объекты.

P.S. Код не проверялся, возможно где-то есть небольшие неточности, но примерно такую же конструкцию сам использовал как-то.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Для этого лучше использовать функцию-словарь
def f(x):
    return {
        'a': 1,
        'b': 2
    }.get(x, 9)    # 9 is default if x not found
...
f('c') # 9
f('a') # 1
f('b') # 3

Ну и вариантов масса - https://ru.stackoverflow.com/questions/460207/%D0%...

def get_temp_description(temp):
    return {
               temp < -20: 'Холодно',
        -20 <= temp < 0:   'Прохладно',
          0 <= temp < 15:  'Зябко',
         15 <= temp < 25:  'Тепло',
         25 <= temp:       'Жарко'
    }[True]
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы