亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python:在 lambda 內部使用 lambda 返回 lambda 對象

Python:在 lambda 內部使用 lambda 返回 lambda 對象

慕哥9229398 2024-01-04 10:13:32
我正在閱讀一個在 lambda 內部使用 lambda 的代碼片段,然后我想通過創建一個從文件讀取然后返回最大和最小數字的虛擬函數來測試它。這就是我想出的dummy = lambda path: (lambda x, y: (lambda data: ([y for x in open(path, "r").readline().splitlines() for y in x])[0])(min(data), max(data)))經過一點格式化,這就是它的樣子(恕我直言,一行代碼更具可讀性。)dummy = lambda path: (    lambda x, y: (        lambda data: ([y for x in open(path, "r").readline().splitlines() for y in x])[            0        ]    )(min(data), max(data)))但它總是返回 lambda 對象Out: <function <lambda>.<locals>.<lambda> at 0x7fe26f00a4c0>或這個'function' object is not subscriptable; perhaps you missed a comma?我究竟做錯了什么?
查看完整描述

2 回答

?
交互式愛情

TA貢獻1712條經驗 獲得超3個贊

dummy = lambda path: (

    lambda x, y: (

        lambda data: ([y for x in open(path, "r").readline().splitlines() for y in x])[

            0

        ]

    )(min(data), max(data))

)

讓我們把它分成幾行。


lamb1 = lambda data: ([y for x in open(path, "r").readline().splitlines() for y in x])[0] 

這看起來不對——為什么不使用數據呢?


下一個:


lamb2 = lambda x, y: lamb1(min(data), max(data))

lamb2使用 2 個參數進行調用lamb1- 的最小值和最大值data。從哪里來data的?為什么我們要將兩個參數傳遞給只需要一個參數的 lambda?


最后:


dummy = lambda path: lamb2

所以 dummy 是一個 lambda,當被調用時,返回 lambda lamb2。您從不調用lamb2,因此您不能期望它返回值。如果你確實調用了lamb2,你會得到一個錯誤。


很難思考和調試單行代碼,所以我們首先將其定義為常規函數。


def dummy(path):

    lines = [int(x) for x in open(path, "r").readlines()]

    smallest = min(lines)

    largest = max(lines)

    return (smallest, largest)

現在將每一行轉換為 lambda:


readfile = lambda file: [int(x) for x in open(file, "r").readlines()]

minmax = lambda data: (min(data), max(data)

dummy = lambda path: minmax(readfile(path))

并加入這些 lambda:


dummy = lambda path: (lambda data: (min(data), max(data)))((lambda file: [int(x) for x in open(file, "r").readlines()])(path))

如果我設置data.txt為


100

23

2349

20

21

1

然后將其運行為


dummy("data.txt")

我得到輸出:


(1, 2349)

請注意,我們仍然有一個錯誤 - 我們沒有進行適當的清理。我們打開一個文件,但從未關閉它。由于 CPython 實現的引用計數機制,這通常不是問題,但引用計數是一個實現細節,其他實現不會這樣做。


要解決這個問題,最好的方法是使用語句with:


def dummy(path):

    with open(path, 'r') as f:

        lines = [int(x) for x in f.readlines()]

    smallest = min(lines)

    largest = max(lines)

    return (smallest, largest)

但故意沒有“with表達”。Python 的設計初衷并不是鼓勵將所有內容都塞進一個大的單行表達式中。


如果我們想編寫大行話lambda并仍然進行適當的清理,最接近問題精神的解決方案是定義一個助手:


def with_(resource, code):

    with resource as x:

        return code(x)

然后我們就可以翻譯了


with open(path, 'r') as f:

    lines = [int(x) for x in f.readlines()]


lines = with_(open(path, 'r'), lambda f: [int(x) for x in f.readlines()])

并將其融入到我們的大話中,


dummy = lambda path: (lambda data: (min(data), max(data)))((lambda file: with_(open(path, 'r'), lambda f: [int(x) for x in f.readlines()]))(path))

當我們這樣做時,我們最好f直接迭代,而不是構建一個列表readlines,然后迭代它:


dummy = lambda path: (lambda data: (min(data), max(data)))((lambda file: with_(open(path, 'r'), lambda f: [int(x) for x in f]))(path))



查看完整回答
反對 回復 2024-01-04
?
catspeake

TA貢獻1111條經驗 獲得超0個贊

此版本的代碼運行每個 lambda 并打印作為參數提供給它的文件的第一行。


我要做的主要事情是將 lambda 聲明包裝在另一組括號中??磥砟J為是一組會導致調用 lambda 的括號,結果卻被視為 lambda 主體的一部分。在 lambda 周圍添加一組括號可以解決這個問題。


然后我遇到了一個問題,你的參數名稱實際上沒有意義,所以為了讓它做某事,我輸入了文字值。


最后,需要先調用最里面的 lambda,然后才能對其返回值(包含文件行的列表)進行操作[0]。


這將打印我為其提供路徑的文本文件的第一行:


dummy = lambda path: (

    (lambda x, y: (

        (lambda data: ([y for x in open(path, "r").readline().splitlines() for y in x]))(3)[0]

    ))(1, 2)

)


print(dummy("/tmp/data.txt"))

結果:


Test file - Line #1


查看完整回答
反對 回復 2024-01-04
  • 2 回答
  • 0 關注
  • 172 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號