@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()
  • Вопрос задан
  • 124 просмотра
Решения вопроса 2
@bacon
Да, это всё можно заменить на словарь {1: ссылка_функцию1, 2: ссылка_функцию2}
Ответ написан
@twistfire92
Во-первых код надо оборачивать в соответствующий тег.

По вашему вопросу. В питоне как такового нет оператора 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
Я мастер на все руки, я козлик Элек Мэк :-)
Для этого лучше использовать функцию-словарь
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]
Ответ написан
Ваш ответ на вопрос

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

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