提问人:James C 提问时间:11/4/2023 最后编辑:Goku - stands with PalestineJames C 更新时间:11/4/2023 访问量:119
Python 嵌套 lambda 函数
Python Nested lambda function
问:
有没有办法编写嵌套的 lambda 函数?以下是我正在尝试做的事情:
s = '123 there'
f = lambda x: x.split()
g = lambda x: [int(x[0]), x[1]]
#g(f(s)) returns [123, 'there']
但是,我想将这两个 lambda 函数合并在一起。
答:
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
你对“嵌套”的想法仍然不清楚。
如果你想要一个行为类似于 的新函数,那么你可以这样做:h
h(x) == g(f(x))
h = lambda x: g(f(x))
如果您想要一个不依赖于 和 的定义的表达式......您可以使用立即执行的内部 Lambda 来模拟变量赋值。f
g
h = lambda x: (lambda y: [int(y[0]), y[1]])(x.split())
弗兰克·耶林(Frank Yellin)的回答具有一定的吸引力,因为它保留了“和”的定义,但将它们拉入了自身的定义中。f
g
h
尽管如此,所有这些都相当复杂,并且在没有 lambda 的情况下表达得更好。
评论
def
x.split()[0]
x.split()
h = lambda s: g(f(s))