簡體   English   中英

在列表推導式中對 lambdas 進行熱切評估

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM