Python 嵌套 lambda 函数

Python Nested lambda function

提问人:James C 提问时间:11/4/2023 最后编辑:Goku - stands with PalestineJames C 更新时间:11/4/2023 访问量:119

问:

有没有办法编写嵌套的 lambda 函数?以下是我正在尝试做的事情:

s = '123 there'
f = lambda x: x.split()
g = lambda x: [int(x[0]), x[1]]

#g(f(s)) returns [123, 'there']

但是,我想将这两个 lambda 函数合并在一起。

python-3.x 字符串 列表 lambda

评论

5赞 Jab 11/4/2023
为什么?Lambda 函数不是为命名函数而设计的。它们应该被使用而不是记住。为什么不直接使用 ?这里的目标是什么?此外,如果不转换为 int 或不包含 2 个元素会发生什么?defx.split()[0]x.split()
0赞 juanpa.arrivillaga 11/4/2023
“嵌套 Lambda 函数”是什么意思?你到底想做什么?“合并”是什么意思?你只是想要吗?h = lambda s: g(f(s))

答:

2赞 Goku - stands with Palestine 11/4/2023 #1

你可以不用lambda与列表推导:

s = '-123 there'

[int(x) if x.lstrip("-").isnumeric() else x for x in s.split() ]

#[-123, 'there']

s = '123 there'

[int(x) if x.lstrip("-").isnumeric() else x for x in s.split() ]

#[123, 'there']

评论

0赞 S.B 11/4/2023
.isdigit()并不等同于。例如,检查负数。int()
1赞 A.J. Uppal 11/4/2023
@S.B 说的是,如果那么你的列表推导将返回,因为是 False。s = '-123 there['-123', 'there']'-123'.isdigit()
0赞 Jab 11/4/2023
def try_int(x): try: return int(x) except ValueError: return x然后在循环中使用它
1赞 Goku - stands with Palestine 11/4/2023
下面是一个使用 isdigit stackoverflow.com/questions/28279732/ 检查负数的示例......
1赞 JonSG 11/4/2023
如果你像我一样写了类似的东西,但使用 而不是 并想知道有什么区别,请查看 Python 中的 str.isdigit()、isnumeric() 和 isdecimal() 有什么区别?.isnumeric().isdigit()
2赞 A.J. Uppal 11/4/2023 #2

我建议不要使用 lambda 函数,除非您的用例适合它们。正如评论所建议的那样,只需使用一个函数!def

但是,您可以执行以下操作来嵌套 lambda 函数。

f = lambda s: (x := s.split(), [int(x[0]), x[1]])[1]

>>> f('123 result')
[123, 'result']
0赞 Jab 11/4/2023 #3

我不建议将 lambda 用于这样的事情。原因是:您为单个函数创建了一个 lambda。这毫无意义。此外,如果拆分字符串后没有 2 个元素,或者第一个元素无法转换为 int 并引发错误,会发生什么情况。

你可以做的是创建一个实际的函数来执行逻辑和错误处理,然后在字符串上使用它:

def try_int(x):
    try:
        return int(x) 
    except ValueError:
        return x

[try_int(x) for x in s]
1赞 Frank Yellin 11/4/2023 #4

我真的,真的,真的不建议这样做。正如其他人所说,这不是 lambda 函数的用途。但是上面的 A J Uppal 给了你一个获得你想要的东西的技巧。这是另一个:

lambda s, f=(lambda x: x.split()), g=(lambda x: [int(x[0]), x[1]]): g(f(s))

我认为这让你的意图更清晰一些。在 lambda 中滥用可选参数的方法有很多种。

但同样,不要这样做。

评论

0赞 A.J. Uppal 11/4/2023
仅用于理论目的...我喜欢这个!跨:)获取复合函数
0赞 Christoph Rackwitz 11/4/2023 #5

你对“嵌套”的想法仍然不清楚。

如果你想要一个行为类似于 的新函数,那么你可以这样做:hh(x) == g(f(x))

h = lambda x: g(f(x))

如果您想要一个不依赖于 和 的定义的表达式......您可以使用立即执行的内部 Lambda 来模拟变量赋值。fg

h = lambda x: (lambda y: [int(y[0]), y[1]])(x.split())

弗兰克·耶林(Frank Yellin)的回答具有一定的吸引力,因为它保留了“和”的定义,但将它们拉入了自身的定义中。fgh

尽管如此,所有这些都相当复杂,并且在没有 lambda 的情况下表达得更好。