Стремительная оценка лямбд в понимании списка - PullRequest
0 голосов
/ 07 января 2019

Рассмотрим функцию python:

def testSetsFromStrings(tt):
  x1= [lambda x: x.split(' ') for x in tt]
  return x1

Давайте вызовем его со следующим:

tt = ['id0 id1 id2 id3 id4', 
'id10 id11 id12 id13 id14', 
'id20 id21 id22 id23 id24', 
' id30 id31 id32 id33 id34', 
'id50 id51 id52 id53 id54']

testSetFromStrings(tt)

После линии x1= .. была установлена ​​точка останова, и мы можем увидеть x1 =

<class 'list'>: [<function testSetsFromStrings.<locals>.<listcomp>.
<lambda> at 0x11cee5730>, <function testSetsFromStrings.<locals>.<listcomp>.
<lambda> at 0x11cee5840>, <function testSetsFromStrings.<locals>.<listcomp>.
<lambda> at 0x11cee58c8>, <function testSetsFromStrings.<locals>.<listcomp>.
<lambda> at 0x11cee5950>, <function testSetsFromStrings.<locals>.<listcomp>.
<lambda> at 0x11cee59d8>]

Я в недоумении относительно того, как заставить lambda быть оцененным с нетерпением . Что тут можно сделать?

** Обновление **

Показанная логика является упрощением многошаговой функции, которая необходима: чтобы сосредоточиться только на механике вызова лямбды. Замена lambda на прямой вызов split не отвечает реальной необходимости.

Ответы [ 3 ]

0 голосов
/ 07 января 2019

Вы также можете использовать функцию карты вместо понимания списка:

x1 = map(lambda x: x.split(' '), tt)

если вы предпочитаете присутствовать функцию lamda. В другом месте просто:

x1 = [x.split(' ') for x in tt]

как уже упоминалось от других.

0 голосов
/ 07 января 2019

Вы определяете функцию, но не применяете к ней аргументы:

Попробуйте вместо этого

x1 = [(lambda x: x.split(' '))(x) for x in tt]

Но было бы лучше просто извлечь определение функции вне понимания, если функция вообще сложна, а затем использовать понимание карты или списка.

0 голосов
/ 07 января 2019

Может быть, вам совсем не нужны лямбды? Это то, что вы хотите?

def testSetsFromStrings(tt):
    x1 = [x.split(' ') for x in tt]
    return x1

Лямбды - это функции: они оцениваются, когда вы их вызываете. Если вы хотите, чтобы они запускались немедленно, то вам, вероятно, совсем не нужна лямбда.

Если вам нужно вызвать функцию, затем вызовите ее:

def testSetsFromStrings(tt):
    x1 = [my_function(x) for x in tt]
    return x1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...