首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:在lambda内部使用lambda返回lambda对象

Python:在lambda内部使用lambda返回lambda对象
EN

Stack Overflow用户
提问于 2020-10-23 21:20:24
回答 2查看 149关注 0票数 3

我正在读取一个在lambda中使用lambda的片段,然后我想通过创建一个虚拟函数来测试它,该函数从一个文件中读取,然后返回最大和最小的数目。

这就是我想出来的

代码语言:javascript
复制
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)))

稍微格式化一下,这就是它的样子(IMHO一条线的可读性要高得多)。

代码语言:javascript
复制
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?

我做错什么了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-23 21:46:00

代码语言:javascript
复制
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))
)

让我们把它分成几行。

代码语言:javascript
复制
lamb1 = lambda data: ([y for x in open(path, "r").readline().splitlines() for y in x])[0] 

这看起来不对--为什么不使用数据呢?

下一步:

代码语言:javascript
复制
lamb2 = lambda x, y: lamb1(min(data), max(data))

lamb2使用data的两个参数- min和max调用lamb1data是从哪里来的?为什么我们要把两个论点传递给一个只想要一个的羔羊呢?

最后:

代码语言:javascript
复制
dummy = lambda path: lamb2

所以,虚拟是一个lambda,当调用它时,返回lambda lamb2。您从不调用lamb2,因此不能期望它返回值。如果您确实调用了lamb2,您将得到一个错误。

很难考虑和调试一行程序,所以让我们首先将其定义为一个常规函数。

代码语言:javascript
复制
def dummy(path):
    lines = [int(x) for x in open(path, "r").readlines()]
    smallest = min(lines)
    largest = max(lines)
    return (smallest, largest)

现在,将每一行转换为lambda:

代码语言:javascript
复制
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))

加入这些羔羊:

代码语言:javascript
复制
dummy = lambda path: (lambda data: (min(data), max(data)))((lambda file: [int(x) for x in open(file, "r").readlines()])(path))

如果我将data.txt设置为

代码语言:javascript
复制
100
23
2349
20
21
1

然后运行这个

代码语言:javascript
复制
dummy("data.txt")

我得到了输出:

代码语言:javascript
复制
(1, 2349)

请注意,我们仍然有一个bug -我们没有做适当的清理。我们打开一个文件,但我们从不关闭它。由于CPython实现的引用计数机制,这通常不是一个问题,但是引用计数是一个实现细节,而其他实现不这样做。

要解决这个问题,最好的方法是使用with语句:

代码语言:javascript
复制
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,并且仍然进行适当的清理,那么最接近问题精神的解决方案是定义一个助手:

代码语言:javascript
复制
def with_(resource, code):
    with resource as x:
        return code(x)

然后我们就可以翻译

代码语言:javascript
复制
with open(path, 'r') as f:
    lines = [int(x) for x in f.readlines()]

代码语言:javascript
复制
lines = with_(open(path, 'r'), lambda f: [int(x) for x in f.readlines()])

把它整合到我们的大飞机上,

代码语言:javascript
复制
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构建一个列表,然后迭代它:

代码语言:javascript
复制
dummy = lambda path: (lambda data: (min(data), max(data)))((lambda file: with_(open(path, 'r'), lambda f: [int(x) for x in f]))(path))
票数 4
EN

Stack Overflow用户

发布于 2020-10-23 21:43:17

此版本的代码运行每个lambda,并打印作为参数提供的文件的第一行。

我必须做的主要事情是将lambda声明包装在另一组括号中。看起来,你认为是一组圆括号,它会导致羔羊被召唤,结果被认为是羔羊身体的一部分。在lambda周围添加一组父母解决了这个问题。

然后,我遇到了一个问题,您的参数名称没有真正的意义,因此,为了让它做一些事情,我把文字值改为。

最后,在返回值(包含文件行的列表)可以使用[0]对其返回值之前,需要调用最内部的lambda。

这将打印文本文件的第一行,我给它提供了路径:

代码语言:javascript
复制
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"))

结果:

代码语言:javascript
复制
Test file - Line #1
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64507452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档