Может сам вызов функции лямбды рекурсивно в Python?

Используйте с. вот моя первая попытка с вашим sql

create table #temp1(_row_ord int,CID int,_data varchar(10))

insert #temp1
values
(1,1001,'text1'),
(2,1001,'text2'),
(4,1002,'text1'),
(5,1002,'text2')


create table #temp2(_row_ord int,CID int,_data varchar(10))
insert #temp2
values
(1,1001,'sample1'),
(2,1001,'sample2'),
(4,1002,'sample1'),
(5,1002,'sample2');

WITH result( _row_ord, CID,_data) AS
(
--My query
select * from #temp1 
union
select * from #temp2 where CID in (select CID from #temp1)


)
select * from tmp order by CID ,_data
drop table #temp1,#temp2

результатом

_row_ord    CID _data
1   1001    sample1
2   1001    sample2
1   1001    text1
2   1001    text2
4   1002    sample1
5   1002    sample2
4   1002    text1
5   1002    text2
63
задан daf 8 January 2010 в 00:22
поделиться

5 ответов

Единственным путем я могу думать, чтобы сделать, это составляет давание функции имени:

fact = lambda x: 1 if x == 0 else x * fact(x-1)

или поочередно, для более ранних версий Python:

fact = lambda x: x == 0 and 1 or x * fact(x-1)

Обновление : с помощью идей из других ответов я смог втиснуть функцию факториала в единственную лямбду без имени:

>>> map(lambda n: (lambda f, *a: f(f, *a))(lambda rec, n: 1 if n == 0 else n*rec(rec, n-1), n), range(10))
[1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]

, Таким образом, это возможно, но не действительно рекомендуемое!

68
ответ дан Greg Hewgill 24 November 2019 в 16:07
поделиться

Вы не можете непосредственно сделать этого, потому что это не имеет никакого имени. Но с функцией помощника как Y-combinator Lemmy указал, можно создать рекурсию путем передачи функции в качестве параметра себе (как странный, поскольку это звучит):

# helper function
def recursive(f, *p, **kw):
   return f(f, *p, **kw)

def fib(n):
   # The rec parameter will be the lambda function itself
   return recursive((lambda rec, n: rec(rec, n-1) + rec(rec, n-2) if n>1 else 1), n)

# using map since we already started to do black functional programming magic
print map(fib, range(10))

Это печатает первые десять Чисел Фибоначчи: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55],

23
ответ дан sth 24 November 2019 в 16:07
поделиться

Да. У меня есть два способа сделать это, и каждый был уже покрыт. Это - мой предпочтительный путь.

(lambda v: (lambda n: n * __import__('types').FunctionType(
        __import__('inspect').stack()[0][0].f_code, 
        dict(__import__=__import__, dict=dict)
    )(n - 1) if n > 1 else 1)(v))(5)
11
ответ дан habnabit 24 November 2019 в 16:07
поделиться

Я никогда не использовал Python, но это , вероятно, что Вы ищете.

6
ответ дан Lemmy 24 November 2019 в 16:07
поделиться

Если Вы были действительно мазохистскими, Вы смогли делать это с помощью C расширения, но повторять Greg (привет Greg!), это превышает возможность лямбды (без имени, анонимный) функция.

номер (для большинства значений не).

-3
ответ дан Gregg Lind 24 November 2019 в 16:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: