如何忽略元组的未打包部分作为lambda的参数?

2024-10-03 09:09:19 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中,按照惯例,下划线(_)通常用于丢弃未打包元组的部分,如下所示

>>> tup = (1,2,3)
>>> meaningfulVariableName,_,_ = tup
>>> meaningfulVariableName
1

我也在尝试对lambda的元组参数做同样的处理。这似乎是不公平的,只能用2元组。。。在

^{pr2}$

你知道为什么吗?最好的方法是什么?在


Tags: 方法lambda参数公平元组tup惯例pr2
3条回答

通常最好使用列表理解,而不是lambdas:

some_list = [(1, 10, 100), (2, 20, 200), (3, 30, 300)]
processed_list = [2 * x for x, dummy1, dummy2 in some_list]

如果你真的坚持,你可以用_代替dummy1和{}。但是,我建议不要这样做,因为我经常看到这会引起混乱。人们常常认为_是某种特殊的语法(例如在Haskell和Rust中),而它只是一些不寻常的变量名,没有任何特殊的属性。使用dummy1这样的名称完全可以避免这种混乱。而且,_与常见的gettext别名冲突,而且它在交互式解释器中也有特殊的意义,所以总体上我更喜欢使用dummy来避免所有的混淆。在

正如在评论中所说的,只需使用盯着的论点 要在“u”中抛出剩余的参数:

lambda x, *_: x*2 

如果您在map语句中使用这些语句,因为Python不会将元组中的每个项映射到不同的参数,那么可以使用itertools.starmap,这样做:

^{pr2}$

但是在sortsorted的关键参数上没有等价的方法。在

如果不在元组中间使用参数, 只需编号:

^{3}$

如果您收到来自某个linter工具的关于未使用的参数的投诉:linter的目的是建议mor可读的代码。我个人的偏好是不让它影响实践性,如果发生这种情况,我会毫不犹豫地关闭这行代码的连接。在

否则,你就真的要做“美丽”的事情了——如果是为了取悦你和你的团队,或者仅仅为了取悦皮匠,你就要用理智。在本例中,它是编写一个完整的函数,并假装 使用未使用的参数。在

def my_otherwise_lambda(x, unused_1, unused_2, w):
     """My make linter-happy docstring here"""
     unused_1, unused_2  # Use the unused variables
     return 2 * x + w

除了linter有问题外,其目的是使lambda参数可读,那么无论如何,建议使用一个完整的函数。lambda为了保证可读性,在v.3.0中几乎要被剥离。在

最后,但并非最不重要的是,如果元组中值的语义有意义,也许您应该考虑使用一个类来保存其中的值。通过这种方式,您只需将该类的实例传递给lambda函数,然后通过它们各自的名称检查值。在

Namedtuple是一种可以很好地工作的方法: 从集合导入namedtuple

vector = namedtuple("vector", "x y z")

mydata = [(1,10,100), (2,20,200), (3,30,300)]
mydata = [vector(*v) for v in mydata]

sorted_data = sorted(mydata, lambda v: v.x * 2)

元组在Python中是不可变的,因此您不能“丢弃”(修改)无关的值。在

另外,由于您不关心这些值是什么,所以完全没有必要将它们分配给变量。在

我要做的是,在您感兴趣的索引处简单地索引元组,如下所示:

>>> list(map(lambda x: x[0] * 2, [(1,10,100), (2,20,200), (3,30,300)]))
[2, 4, 6]

不需要*args或伪变量。在

相关问题 更多 >