LINUX.ORG.RU

Нубский и очень тупой вопрос по питону

 , ,


0

2

Нагуглил про то, что switch case в питоне нет, но можно сделать примерно так:

def test(x):
   return {
      1: "1",
      2: "2",
      3: "3"
   }.get(x)


Вроде красиво, позволяет избавиться от кучи if'ов.

Но вот в чем проблема. Пишут, что второй аргумент в get() - это то, что будет возвращено, если в словаре нет нужного значения. Я же решил в этом случае вызывать функцию еще раз (если введено что-то другое, там идет ввод с input). Тогда во всех случаях функция будет вызываться еще раз. Если же ввести
lambda: test(x)
, то тогда всё работает, но если введено что-то другое, то возвращается что-то вроде
<function proxy_type.<locals>.<lambda> at 0x057DD9C0>
, и функция не выполняется еще раз, как задумывалось. Я просто не совсем понимаю, как это работает.

Так вот, вопрос такой: возможно ли реализовать такое и как правильно?

UPD: пользуясь случаем, спрошу: как можно вывести постоянно изменяющуюся переменную, чтобы она выводилась на одной строке, а не каждый раз на новой?



Последнее исправление: ozz_is_here (всего исправлений: 1)

Питон сначала вычисляет аргументы функций, потом подставляет их. В твоем случае сначал будет вызван input() потом с его значением будет вызвана get(). Во втором случае подставляется ссылка на функцию.

Yur4eg ★★
()

Вроде красиво, позволяет избавиться от кучи if'ов.

Получается говнокод. Если тебе просто нужно возвращать значение - то просто используй метод .get(value, «default») на словарь, без всяких там новых фукнций.

Если тебе нужно что-то больше чем просто возврат значений - используй elif

Siado ★★★★★
()
Ответ на: комментарий от bvn13

implement-switch-case-statement-python-138315

Как много телодвижений для ненужности которую никто не использует.

Siado ★★★★★
()
Ответ на: комментарий от Siado

Если тебе нужно что-то больше чем просто возврат значений - используй elif

Эх, ладно, спасибо.

ozz_is_here
() автор топика

Конструкции switch-case достаточно оператора ==, тогда как словарь накладывает более строгие ограничения на данные, и поэтому эквивалентной конструкцией не является

Crocodoom ★★★★★
()

Это всетаки васянский способ, но если хочешь так, то тебе надо чтобы в словаре лежали лямбды которые будут возвращать новые значения, тогда можно будет делать так .get(x, lambda: test(x))(). Но это стремно, так что можешь просто проверять возвращаемое значение на is None, и вызывать еще раз по условию (думаю к этому можно даже декоратор написать)

Dred ★★★★★
()
Ответ на: комментарий от Dred

но если хочешь так

Не то что бы прям хочу так, просто способ интересным показался, и поэтому спросил, можно сделать, чтобы это так работало.

то тебе надо чтобы в словаре лежали лямбды которые будут возвращать новые значения

Можно поподробнее пожалуйста?

ozz_is_here
() автор топика
Ответ на: комментарий от ozz_is_here

Можно поподробнее пожалуйста?

Эм, ну у тебя например написано так 2: «2», превращаешь это в 2: lambda: 2. В итоге .get будет возвращать ф-ции.

способ интересным показался

Ну в нагрузку тебе тогда, кортежи и списки можно использовать вместо условий.

y = (12,21)[x > 16]
(test1, test2)[y == 12]()

Dred ★★★★★
()
Последнее исправление: Dred (всего исправлений: 1)
Ответ на: комментарий от Crocodoom

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

genryRar ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.