gpt4 book ai didi

python - 'lambda' 关键字的更短替代方案?

转载 作者:太空狗 更新时间:2023-10-29 20:39:19 25 4
gpt4 key购买 nike

背景:

Python 是关于简单性和可读性的代码。它在各个版本中变得更好,我是它的 super 粉丝!但是,键入 l a m b d a 每次我都必须定义一个 lambda 并不好玩(你可能不同意)。问题是,这 6 个字符 l a m b d a 使我的语句更长,尤其是当我在 mapfilter 中嵌套几个 lambda 时。我没有嵌套超过 2 或 3 个,因为它带走了 python 的可读性,即使输入 l a m b d a 感觉太冗长了。

实际问题(在评论中):

# How to rename/alias a keyword to a nicer one? 
lines = map(lmd x: x.strip(), sys.stdin)

# OR, better yet, how to define my own operator like -> in python?
lines = map(x -> x.strip(), sys.stdin)
# Or may be :: operator is pythonic
lines = map(x :: x.strip(), sys.stdin)

# INSTEAD of this ugly one. Taking out this is my goal!
lines = map(lambda x: x.strip(), sys.stdin)

我很高兴像这样添加导入:

from myfuture import lmd_as_lambda
# OR
from myfuture import lambda_operator

最佳答案

好消息是:您根本不需要使用mapfilter,您可以使用generator expressions。 (懒惰)或 list comprehensions (渴望)而不是因此完全避免 lambda

所以代替:

lines = map(lambda x: x.strip(), sys.stdin)

只需使用:

# You can use either of those in Python 2 and 3, but map has changed between
# Python 2 and Python 3 so I'll present both equivalents:
lines = (x.strip() for x in sys.stdin) # generator expression (Python 3 map equivalent)
lines = [x.strip() for x in sys.stdin] # list comprehension (Python 2 map equivalent)

如果您使用推导式,它可能也会更快。很少有函数在 mapfilter 中使用时实际上更快 - 使用 lambda 有更多的反模式(而且很慢) .


该问题仅包含 map 的示例,但您也可以替换 filter。例如,如果你想过滤奇数:

filter(lambda x: x%2==0, whatever)

您可以改用条件推导式:

(x for x in whatever if x%2==0)
[x for x in whatever if x%2==0]

您甚至可以将 mapfilter 结合在一个理解中:

(x*2 for x in whatever if x%2==0)

只要考虑使用 mapfilter 会是什么样子:

map(lambda x: x*2, filter(lambda x: x%2==0, whatever))

注意:这并不意味着 lambda 没有用! lambda 在很多地方都非常方便。考虑 key argument for sorted (同样适用于 minmax)或 functools.reduce (但最好远离该函数,大多数时候普通的 for 循环更具可读性)或需要谓词函数的 itertools:itertools.accumulate , itertools.dropwhile , itertools.groupbyitertools.takewhile .仅举几个 lambda 可能有用的例子,可能还有很多其他地方。

关于python - 'lambda' 关键字的更短替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45766630/

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