- 1
a < 5 and a or 5
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−92
a < 5 and a or 5
Вы все еще думаете, что сочетание and'а и or'а это тернарник? Тогда мы идем к вам :)
http://ideone.com/qC0TyS
bormand 28.08.2013 18:23 # +3
Или минусуют, наоборот, те, кто думает, что я зазря эту конструкцию охаиваю? :)
Нате вам тогда на закуску говнофикс, по методике со stackoverflow: И люди на полном серьезе предлагают юзать эту хуиту как тернарник... Куда катится мир...
kegdan 28.08.2013 18:29 # 0
Классика лучше
Stertor 12.09.2013 22:28 # −1
anonimb84a2f6fd141 28.08.2013 18:38 # −1
anonimb84a2f6fd141 28.08.2013 19:41 # −2
Elvenfighter 29.08.2013 10:24 # +3
bormand 29.08.2013 10:33 # +1
anonimb84a2f6fd141 29.08.2013 12:18 # −2
anonimb84a2f6fd141 28.08.2013 19:45 # +1
http://www.diveintopython.net/power_of_introspection/and_or.html
Вот откуда эта херня прет!
bormand 28.08.2013 19:50 # +1
http://www.ibm.com/developerworks/linux/library/l-prog/index.html
Причем тут даже не предупредили про подводный камень.
А еще они там пропагандируют циклы делать в виде рекурсии... что питону вообще противопоказано, ибо он не умеет в tail-call optimization (намеренно не умеет, чтобы бектрейсы были полные и красивые).
kegdan 28.08.2013 19:56 # 0
Ведь простое лучше сложного)
Вообще дао у питона очень верное
bormand 28.08.2013 20:09 # +1
Ну да. Они эквивалентны. Поэтому некоторые компиляторы, типа gcc умеют превращать хвостовую рекурсию в цикл.
В питоне так не делают исключительно для красивых бектрейсов. И это, имхо, правильно. Один фиг это не ФЯП, такой как хаскель, в котором рекурсия это основа мироздания, а самый обычный императивный язык.
anonimb84a2f6fd141 28.08.2013 22:51 # 0
Vindicar 28.08.2013 23:31 # 0
Уж лучше явно развернуть.
kegdan 28.08.2013 19:51 # 0
roman-kashitsyn 28.08.2013 19:54 # +5
3.14159265 29.08.2013 12:23 # 0
http://www.youtube.com/watch?v=a88Z7YOh_us
kegdan 29.08.2013 14:40 # 0
anonimb84a2f6fd141 29.08.2013 14:56 # +1
wvxvw 28.08.2013 19:59 # 0
bormand 28.08.2013 20:05 # +1
Посмотрите по ссылке на ideone вывод при a = 0.
> неожиданного
Ну да, результат вполне ожидаем. Вот только нубы бездумно юзают эту херню как тернарник, и потом неожиданно налетают на этот ожидаемый результат :)
wvxvw 28.08.2013 20:09 # 0
Ж.скрипт так же работает, например.
bormand 28.08.2013 20:16 # +1
У тернарника ведь определение: вычисляет левую часть, и возвращает ее результат, если условие истинно; вычисляет правую часть и возвращает ее результат, если условие ложно.
> Ж.скрипт так же работает, например.
Угу. На лиспе вроде тоже так можно?
P.S. В общем суть в чем - не надо рекламировать эту херню, как замену тернарника. А если кто-то и рассказыват нубу об этом хаке - то пускай не поленится рассказать и про подводный камень. В питоне до 2.4 тернарника нет, и точка. А в жс есть нормальный.
wvxvw 28.08.2013 20:17 # 0
bormand 28.08.2013 20:19 # 0
А or и and возвращают сами значения, или настоящие T и nil?
UPD: Хотя да, там же false это только nil...
wvxvw 28.08.2013 20:21 # 0
Есть такое понятие, как generalized boolean. Если функция описана, как возвращающая generalized boolean, тогда она может вернуть все, что формально является подклассом T, нe обязательно именно T.
bormand 28.08.2013 20:22 # 0
Питонисты :) В питоне же относительно недавно появился их thenValue if cond else elseValue, вот они и выеживались как могли.
anonimb84a2f6fd141 28.08.2013 22:56 # +2
>Python 2.5 was released on September 19th 2006
Ага, недавно. Видимо, он просто некоторым людям так понравился, что они его юзают, даже не задумываясь о последствиях.
bormand 28.08.2013 20:24 # 0
Кстати, я туплю, или в лиспе все кроме nil является подклассом T?
> все, что формально является подклассом T
Ну вот в яваскрипте и питоне не совсем так. Там в спеках конкретно указано, что и когда оно возвращает. Т.е. там не какое-попало значение, считающееся true, а именно последний из рассмотренных аргументов and/or. И если бы там была такая свободная формулировка, как вы привели - этот or/and хак бы не родился, или сразу бы сдох как использование UB'а ;)
kegdan 28.08.2013 20:30 # −1
bormand 28.08.2013 20:31 # 0
Наверное все-таки считается T, а не возвращает?
kegdan 28.08.2013 20:35 # 0
wvxvw 28.08.2013 20:34 # 0
bormand 28.08.2013 20:46 # 0
Ну, кстати, пустой список () это же алиас для nil (или наоборот), так что уже умудрились объявить ;)
wvxvw 28.08.2013 21:25 # 0
kegdan 28.08.2013 20:22 # +2
bormand 28.08.2013 20:28 # +2
3.14159265 29.08.2013 13:14 # 0
Если в языке нету короткого паттерн-матчинга, или убогие свитчи(подвид:сишкоблядские), то только тогда полезно .
kegdan 29.08.2013 20:22 # 0
1 - нужно знать, как сделать тоже самое без сахара
2 - понимать что сильно сладко - это к диабету
anonimb84a2f6fd141 29.08.2013 21:12 # 0
anonimb84a2f6fd141 29.08.2013 22:32 # +1
1024-- 30.08.2013 02:32 # +2
О них ещё на IThappens пишут.
anonimb84a2f6fd141 30.08.2013 07:14 # 0
bormand 30.08.2013 09:53 # 0
anonimb84a2f6fd141 30.08.2013 13:08 # 0
bormand 30.08.2013 09:54 # 0
kegdan 30.08.2013 10:22 # 0
anonimb84a2f6fd141 30.08.2013 13:08 # 0
anonimb84a2f6fd141 28.08.2013 22:54 # 0
Elvenfighter 29.08.2013 10:15 # +4
http://ideone.com/VArlvi
bormand 29.08.2013 10:35 # +1
Но все равно какой-то костыль.
kegdan 29.08.2013 10:45 # 0
3.14159265 29.08.2013 13:03 # 0
Неужели в хацкиле как-то по другому?
По мне лучше вынести в функцию:
ter(a < 5 , (lambda: a) , (lambda: 5))
А всё зло оттого что люди готовы пойти на любое преступление лишь бы чтобы не писать обычный, императивный if или for, ибо так-то скучно, немодно и вообще тупо... Тяга к "умному" коду до добра не доводит.
Ну и отчасти конструкты не возвращают значения.
kegdan 29.08.2013 14:42 # 0
ter(a < 5 , a, 5)
3.14159265 29.08.2013 14:43 # +1
Если конкретный случай, как тут и передается посчитанное значение, то вполне.
vistefan 29.08.2013 20:18 # +1
bormand 29.08.2013 20:55 # 0
vistefan 29.08.2013 21:10 # 0
anonimb84a2f6fd141 29.08.2013 21:11 # 0
vistefan 29.08.2013 21:22 # 0
anonimb84a2f6fd141 29.08.2013 21:29 # 0
kegdan 29.08.2013 21:34 # +1
bormand 29.08.2013 21:44 # +1
kegdan 29.08.2013 21:48 # 0
bormand 29.08.2013 21:54 # 0
Больше ниче не посоветую, мне граватар не светит. Во-первых домен, на котором висит это мыло, не принимается граватаром. Во-вторых я тупо забыл, на какое мыло тут зарегана учетка ;)
kegdan 29.08.2013 21:58 # 0
bormand 29.08.2013 21:59 # 0
kegdan 29.08.2013 22:00 # 0
bormand 29.08.2013 22:31 # 0
bormand 29.08.2013 16:32 # 0
В хацкиле вообще банальный тернарник:
3.14159265 29.08.2013 16:40 # 0
bormand 29.08.2013 16:48 # +1
> По мне лучше вынести в функцию
Если уж писать отдельную функцию, то в ней можно сделать человеческий if:
3.14159265 29.08.2013 17:00 # 0
Именно. Да можно сделать джве функции: iif и lazyIif.
Это то об чем говорилось выше: в языках с довольно развитой системой макросов или способов композиции кода тернарник не нужен вовсе. Поскольку не составит труда сделать свой средствами языка.
guest 16.09.2014 09:01 # 0
bormand 16.09.2014 10:34 # 0
guest 16.09.2014 10:41 # 0
Прозрачная запись, никаких хаков. А что еще, если не это?
bormand 16.09.2014 11:04 # +2
1024-- 16.09.2014 11:07 # 0
Сначала делаем, потом думаем, потом исправляем ошибки, если додумались до false.
Просто квантовая интегральная питушня <x|ψ|y> выходит.
<then|if|else>
guest 16.09.2014 13:04 # 0
По-сути одно и тоже, только акценты расставлены по другому. Высказывание, где основное действие идет первым (x if y else z), будет понятнее в контексте программы, в том случае, если основное действие это продолжение алгоритма, а проверка условия - цикл или исключение. Так что все зависит от того как программист пишет, как привык писать и читать код. Читаем мы блоками, высказываниями, поэтому такая конструкция просто непривычна для тех, кто долго использует if x then y else z. Это все субъективно.
1024-- 16.09.2014 13:22 # 0
По мне - так тут как-то несимметрично относительно операндов-кандидатов-на-возвращение.
Если и использовать такой подход, то красивее он бы смотрелся в математическом смысле в выражениях вида
guest 16.09.2014 14:40 # 0
Это фактически копипаста из статьи "Тернарная условная операция" википедии, отредактированная под ваше условие.
Честно говоря, мне непонятно почему для таких ветвлений подходит, а как самостоятельная x if y then z - уже не нравится. По поводу симметричности не согласен =) A<- if ->B
P.S. Извиняюсь, если код "поехал", предпросмотра не имею.
1024-- 16.09.2014 14:52 # 0
А в моём примере x, y, z и t стоят каждая в своём выражении, которое для всех одинаково.
Не надо это понимать, это
>>> Дело привычки
> По поводу симметричности не согласен =) A<- if ->B
В общем-то да. Ещё бы вместо then и else запилить <x|ψ|y> .