gpt4 book ai didi

Python:在 lambda 中使用 lambda 返回 lambda 对象

转载 作者:行者123 更新时间:2023-12-04 16:38:58 26 4
gpt4 key购买 nike

我正在阅读一个在 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?

我做错了什么?

最佳答案

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 expression”。 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))

关于Python:在 lambda 中使用 lambda 返回 lambda 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64507452/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com