- 1
a < 5 and a or 5
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−92
a < 5 and a or 5
Вы все еще думаете, что сочетание and'а и or'а это тернарник? Тогда мы идем к вам :)
http://ideone.com/qC0TyS
Или минусуют, наоборот, те, кто думает, что я зазря эту конструкцию охаиваю? :)
Нате вам тогда на закуску говнофикс, по методике со stackoverflow: И люди на полном серьезе предлагают юзать эту хуиту как тернарник... Куда катится мир...
Классика лучше
http://www.diveintopython.net/power_of_introspection/and_or.html
Вот откуда эта херня прет!
http://www.ibm.com/developerworks/linux/library/l-prog/index.html
Причем тут даже не предупредили про подводный камень.
А еще они там пропагандируют циклы делать в виде рекурсии... что питону вообще противопоказано, ибо он не умеет в tail-call optimization (намеренно не умеет, чтобы бектрейсы были полные и красивые).
Ведь простое лучше сложного)
Вообще дао у питона очень верное
Ну да. Они эквивалентны. Поэтому некоторые компиляторы, типа gcc умеют превращать хвостовую рекурсию в цикл.
В питоне так не делают исключительно для красивых бектрейсов. И это, имхо, правильно. Один фиг это не ФЯП, такой как хаскель, в котором рекурсия это основа мироздания, а самый обычный императивный язык.
Уж лучше явно развернуть.
http://www.youtube.com/watch?v=a88Z7YOh_us
Посмотрите по ссылке на ideone вывод при a = 0.
> неожиданного
Ну да, результат вполне ожидаем. Вот только нубы бездумно юзают эту херню как тернарник, и потом неожиданно налетают на этот ожидаемый результат :)
Ж.скрипт так же работает, например.
У тернарника ведь определение: вычисляет левую часть, и возвращает ее результат, если условие истинно; вычисляет правую часть и возвращает ее результат, если условие ложно.
> Ж.скрипт так же работает, например.
Угу. На лиспе вроде тоже так можно?
P.S. В общем суть в чем - не надо рекламировать эту херню, как замену тернарника. А если кто-то и рассказыват нубу об этом хаке - то пускай не поленится рассказать и про подводный камень. В питоне до 2.4 тернарника нет, и точка. А в жс есть нормальный.
А or и and возвращают сами значения, или настоящие T и nil?
UPD: Хотя да, там же false это только nil...
Есть такое понятие, как generalized boolean. Если функция описана, как возвращающая generalized boolean, тогда она может вернуть все, что формально является подклассом T, нe обязательно именно T.
Питонисты :) В питоне же относительно недавно появился их thenValue if cond else elseValue, вот они и выеживались как могли.
>Python 2.5 was released on September 19th 2006
Ага, недавно. Видимо, он просто некоторым людям так понравился, что они его юзают, даже не задумываясь о последствиях.
Кстати, я туплю, или в лиспе все кроме nil является подклассом T?
> все, что формально является подклассом T
Ну вот в яваскрипте и питоне не совсем так. Там в спеках конкретно указано, что и когда оно возвращает. Т.е. там не какое-попало значение, считающееся true, а именно последний из рассмотренных аргументов and/or. И если бы там была такая свободная формулировка, как вы привели - этот or/and хак бы не родился, или сразу бы сдох как использование UB'а ;)
Наверное все-таки считается T, а не возвращает?
Ну, кстати, пустой список () это же алиас для nil (или наоборот), так что уже умудрились объявить ;)
Если в языке нету короткого паттерн-матчинга, или убогие свитчи(подвид:сишкоблядские), то только тогда полезно .
1 - нужно знать, как сделать тоже самое без сахара
2 - понимать что сильно сладко - это к диабету
О них ещё на IThappens пишут.
http://ideone.com/VArlvi
Но все равно какой-то костыль.
Неужели в хацкиле как-то по другому?
По мне лучше вынести в функцию:
ter(a < 5 , (lambda: a) , (lambda: 5))
А всё зло оттого что люди готовы пойти на любое преступление лишь бы чтобы не писать обычный, императивный if или for, ибо так-то скучно, немодно и вообще тупо... Тяга к "умному" коду до добра не доводит.
Ну и отчасти конструкты не возвращают значения.
ter(a < 5 , a, 5)
Если конкретный случай, как тут и передается посчитанное значение, то вполне.
Больше ниче не посоветую, мне граватар не светит. Во-первых домен, на котором висит это мыло, не принимается граватаром. Во-вторых я тупо забыл, на какое мыло тут зарегана учетка ;)
В хацкиле вообще банальный тернарник:
> По мне лучше вынести в функцию
Если уж писать отдельную функцию, то в ней можно сделать человеческий if:
Именно. Да можно сделать джве функции: iif и lazyIif.
Это то об чем говорилось выше: в языках с довольно развитой системой макросов или способов композиции кода тернарник не нужен вовсе. Поскольку не составит труда сделать свой средствами языка.
Прозрачная запись, никаких хаков. А что еще, если не это?
Сначала делаем, потом думаем, потом исправляем ошибки, если додумались до false.
Просто квантовая интегральная питушня <x|ψ|y> выходит.
<then|if|else>
По-сути одно и тоже, только акценты расставлены по другому. Высказывание, где основное действие идет первым (x if y else z), будет понятнее в контексте программы, в том случае, если основное действие это продолжение алгоритма, а проверка условия - цикл или исключение. Так что все зависит от того как программист пишет, как привык писать и читать код. Читаем мы блоками, высказываниями, поэтому такая конструкция просто непривычна для тех, кто долго использует if x then y else z. Это все субъективно.
По мне - так тут как-то несимметрично относительно операндов-кандидатов-на-возвращение.
Если и использовать такой подход, то красивее он бы смотрелся в математическом смысле в выражениях вида
Это фактически копипаста из статьи "Тернарная условная операция" википедии, отредактированная под ваше условие.
Честно говоря, мне непонятно почему для таких ветвлений подходит, а как самостоятельная x if y then z - уже не нравится. По поводу симметричности не согласен =) A<- if ->B
P.S. Извиняюсь, если код "поехал", предпросмотра не имею.
А в моём примере x, y, z и t стоят каждая в своём выражении, которое для всех одинаково.
Не надо это понимать, это
>>> Дело привычки
> По поводу симметричности не согласен =) A<- if ->B
В общем-то да. Ещё бы вместо then и else запилить <x|ψ|y> .