@ru_python

Страница 907 из 9768
Марк
03.06.2016
17:00:29
Вот тоже занятная штука. В уме предлагается решить(2.7 как в тройке хз) (lambda x:x(x))(lambda z: lambda y:z)(1)(2)(3)

Google
Zart
03.06.2016
17:01:37
3 наверное

гм. проверил и таки ква

Марк
03.06.2016
17:02:17
Ну что ты спойлишь

Я вообще зх, как это решать( Я не понимаю, как ездит эта конструкция

Zart
03.06.2016
17:03:03
там проблема в том чтобы определить приоритеты

Марк
03.06.2016
17:04:01
Эта же задачка на js 1.8 (function (x) x(x))(function (z) function (y) z)(1)(2)(3)

Я не понимаю, почему код вообще валидный

Zart
03.06.2016
17:05:10
вполне валидный

обычные кложуры

»> e = '(lambda x:x(x))(lambda z: lambda y:z)(1)(2)(3)' »> t = ast.parse(e) »> list(ast.walk(t)) [<_ast.Module object at 0x027726F0>, <_ast.Expr object at 0x027BF470>, <_ast.Call object at 0x027BF670>, <_ast.Call object at 0x027BF450>, <_ast.Num object at 0x027C6910>, <_ast.Call object at 0x027BF590>, <_ast.Num object at 0x027C68F0>, <_ast.Call object at 0x027BF5D0>, <_ast.Num object at 0x027C68D0>, <_ast.Lambda object at 0x027BF690>, <_ast.Lambda object at 0x027BF5B0>, <_ast.arguments object at 0x027BF5F0>, <_ast.Call object at 0x027BF4B0>, <_ast.arguments object at 0x027BF550>, <_ast.Lambda object at 0x027C6850>, <_ast.Name object at 0x027BF6B0>, <_ast.Name object at 0x027BF530>, <_ast.Name object at 0x027BF4F0>, <_ast.Name object at 0x027BF570>, <_ast.arguments object at 0x027C6870>, <_ast.Name object at 0x027C68B0>, <_ast.Param object at 0x02764B70>, <_ast.Load object at 0x027647D0>, <_ast.Load object at 0x027647D0>, <_ast.Param object at 0x02764B70>, <_ast.Name object at 0x027C6890>, <_ast.Load object at 0x027647D0>, <_ast.Param object at 0x02764B70>]

вот так питон разбивает это выражение на токены, под капотом

Марк
03.06.2016
17:08:49
Всё равно нихера не понятно

Zart
03.06.2016
17:09:03
давай по порядку

Google
Zart
03.06.2016
17:09:14
дано (lambda x:x(x))(lambda z: lambda y:z)(1)(2)(3)

по правилам, то что в скобочках вычисляется первым, правильно?

т.е. (lambda x:x(x))

это дает нам анонимную функцию, которая жрёт чтото на входе и после вызова возвращает то что ей скормили

поэтому следующая скобка ( - это вызов этой самой лямбды

и получается что (lambda x:x(x))(lambda z: lambda y:z) принимает на входе вот ту зет-лямбду и её же возвращает

т.е. фактически это noop

и мы получили по факту lambda z: lambda y:z

Марк
03.06.2016
17:11:30
In [10]: a = (lambda x:x(x)) In [11]: a Out[11]: <function __main__.<lambda>>

Zart
03.06.2016
17:11:36
а теперь мы вызываем эту лямбду с (1)

а нет ,вру...

там же не x:x, а x:x(x)

Марк
03.06.2016
17:12:40
In [12]: (lambda x:x(x))(1) Сразу ругань

Zart
03.06.2016
17:13:06
a(lambda x:100)

100

Марк
03.06.2016
17:13:47
Как она входящие принимает? Давай с простого, я ее только в книгах видал, а так не юзал

Zart
03.06.2016
17:14:11
тогда (lambda x:x(x))(lambda z: lambda y:z) дает нам довольно веселую вещь (lambda z:lambda y:z)(lambda z:lambda y:z)

lambda arguments, *posargs, **kwargs:expression эквивалентна def f(arguments, *posargs, **kwargs): return expression

(lambda z:lambda y:z)(lambda z:lambda y:z) дает нам lambda yy:(lambda z:lambda y:z)

теперь вызов этой фигни с (1) вернет нам (lambda z:lambda y:z)

Google
Zart
03.06.2016
17:18:06
вызов с (2) дает нам lambda yyy:2

и финальный вызов с (3) вернет нам 2

довольно извращенно

Марк
03.06.2016
17:23:27
А как мы забираем для правой лямбды аргумент?

Zart
03.06.2016
17:23:45
тут происходит объявление лямбд и тут же вызов их

и они каррят

Марк
03.06.2016
17:24:26
Чего?

(lambda z: lambda y:z)(1)(2) Out[7]: 1

Zart
03.06.2016
17:25:48
»> (lambda x:1) <function <lambda> at 0x02755930> »> (lambda x:1)(0) 1 »> (lambda x:1)(123) 1

Марк
03.06.2016
17:25:54
Тут это валидно

Zart
03.06.2016
17:25:55
вот это ясно как работает?

»> (lambda x:x)(0) 0 »> (lambda x:x)(1) 1

и это думаю тоже

Марк
03.06.2016
17:27:03
Ага, разобрался

Zart
03.06.2016
17:27:39
»> (lambda x:(lambda:x))(0)() 0 »> (lambda x:(lambda:x))(1)() 1

»> (lambda x:(lambda y:x))(0)('y') 0 »> (lambda x:(lambda y:x))(1)('y') 1

избавляемся от некоторых скобок и получаем что игрек там чисто для отвода глаз

Марк
03.06.2016
17:28:41
n [25]: (lambda x,y:y)(10,20) Out[25]: 20

Значение всегда только одно?

Kolyann
03.06.2016
17:29:08
Значение всегда только одно?
ну поставь вместо :y -> :(y,x)

Google
Zart
03.06.2016
17:29:14
ты можешь возвращать что угодно - туплы, дикты, лямбды 8)

Kolyann
03.06.2016
17:29:15
вернёт тульпу

Alex
03.06.2016
17:29:35
// если кому надо, то здесь xyz по 15 центов namecheap.com

Марк
03.06.2016
17:30:12
Всё. Вьехал

Zart
03.06.2016
17:31:14
когда мы объявляем функцию, которая возвращает другую функцию - у той всё еще остается ссылка на аргументы изначальной функции

поэтому мы можем сделать несколько вызовов такой ерунды и получить разные функции, которые будут помнить что им изначально задали

такая фигня зовется кложурой

к примеру человек выше вон просил упростить ему код в ткинтере применяем лямбды: layout = ( (butt0, 4, 0, 1), (butt1, 1, 0, 1), (butt2, 1, 1, 1), (butt3, 1, 2, 1), (butt4, 2, 0, 1), (butt5, 2, 1, 1), (butt6, 2, 2, 1), (butt7, 3, 0, 1), (butt8, 3, 1, 1), (butt9, 3, 2, 1), (buttdot, 4, 1, 1), (buttdiv, 4, 3, 1), (buttmulti, 1, 3, 1), (buttplus, 3, 3, 1), (buttminus, 2, 3, 1), (buttequal, 5, 3, 3), ) place = lambda (btn, row, column, columnspan):btn.grid(row=row, column=column, columnspan=columnspan) map(place, layout)

(так делать в реальном коде не надо, если что)

Марк
03.06.2016
17:35:34
Код же проще вставить, чем скрин

Kolyann
03.06.2016
17:36:42
Код же проще вставить, чем скрин
хз, привык скрины кидать с идлы

m1 = lambda x: re.match('(.*?[aoeui]){3}',x) m2 = lambda s: len(re.findall('(.)(?=\\1)',s)) m3 = lambda s: sum(list(map(lambda x:x in s,['ab','cd','pq','xy'])))==0

Марк
03.06.2016
17:38:42
Болчег бузил как-то на идлы, мол неудобно ему, если надо влезсть в код на левом серваке, а там только вим/фар или mc

Zart
03.06.2016
17:39:10
втф идла?

sum(list(...)) - бессмысленное использование list

у идлы довольно ебанутая эмуляция консоли

Kolyann
03.06.2016
17:40:42
sum(list(...)) - бессмысленное использование list
это я только начинал лямбды и компрехенсы учить

Марк
03.06.2016
17:40:46
безумные лямбды матчащие какие-то условия
А вам не кажется, что это перлоебство?) Меня в пайтоне такие штуки в ступор вводят(но я нубас, признаю)

Zart
03.06.2016
17:40:51
уже не раз видел новичков, которые пытались под ним работать с тк/вх/куте/пигтк и получали очень странные вещи

Google
Kolyann
03.06.2016
17:41:04
перлоёбство это вот

for i in $(ls *.gz); do echo -n $i | perl -ne 's/.*?(RUS..).*/\1;/; print'; zcat $i | perl -ne '@F = split(/;/); $s1 += $F[4]; $s2 += $F[5]; $s3 += $F[6]; END{print($s1.";".$s2.";".$s3."\n");}'; done > res_1.txt

Zart
03.06.2016
17:42:44
выглядит как подсчет трафика по сжатым логам веб-сервера

Kolyann
03.06.2016
17:43:48
какую-то сумму-хуюмму считал

Марк
03.06.2016
17:43:48
Это как способ ебли с мервыми овечками особо изощренным образом. Но для перла как раз норма

Zart
03.06.2016
17:43:55
при этом выводятся имена файлов с (RUS** в имени

проще было тупо zcat *.gz | awk имхо

Kolyann
03.06.2016
17:44:38
я так и не вкурил авк

Zart
03.06.2016
17:44:46
зря

он охуителен, а синтаксис прост как три копейки

Kolyann
03.06.2016
17:45:20
мне там что-то показалось крайне неочевидным для меня

не помню уже что

(ПЕРЛ-ТО ОЧЕВИДЕН КАНЕШН ДА)

Dmitry
03.06.2016
17:45:38
Ларри ниасилил awk и наговнокодил perl

Zart
03.06.2016
17:45:40
обычно одним авком можно запилить обработку вот такого вида, причем очень наглядно

Марк
03.06.2016
17:45:47
АВК - это как секс под одеялом, а перл - охохо, огого, Браззерс отдыхают

Zart
03.06.2016
17:45:59
ларри взял и испортил авк

Марк
03.06.2016
17:46:32
Ой, ща покажу вам еще изврат. Правда, у меня уже не запускается

Страница 907 из 9768