[英]Eager evaluation of lambdas within a list comprehension
考虑一个python函数:
def testSetsFromStrings(tt):
x1= [lambda x: x.split(' ') for t 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
替换lambda
并不能满足真正的需求。
也许你根本不想要 lambdas? 这是你想要的吗?
def testSetsFromStrings(tt):
x1 = [x.split(' ') for x in tt]
return x1
Lambda 是函数:当您调用它们时,它们会被评估。 如果您希望它们立即运行,那么您可能根本不需要 lambda。
如果你需要调用一个函数,那么调用它:
def testSetsFromStrings(tt):
x1 = [my_function(x) for x in tt]
return x1
您正在定义函数,但未对其应用任何参数:
试试这个
x1 = [(lambda x: x.split(' '))(x) for x in tt]
但是,如果函数完全复杂,那么最好只提取推导式之外的函数定义,然后使用映射或列表推导式。
您还可以使用 map 函数而不是列表理解:
x1 = map(lambda x: x.split(' '), tt)
如果您更喜欢存在 lamda 函数。 在其他地方只是:
x1 = [x.split(' ') for x in tt]
正如其他人提到的那样。
您需要了解的是,lambda 本身就是函数。 因此,创建一个 lambda 函数并调用它。
testSetsFromStrings = lambda x: x.split(' ')
x1 = [testSetsFromStrings(t) for t in tt]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.