繁体   English   中英

Python lambda 函数下划线-冒号语法解释?

[英]Python lambda function underscore-colon syntax explanation?

在以下“aDict”是字典的 Python 脚本中,“_: _[0]”在 lambda 函数中做了什么?

sorted(aDict.items(), key=lambda _: _[0])

在 Python 中_ (下划线)是一个有效的标识符,可以用作变量名,例如

>>> _ = 10
>>> print(_)
10

因此,它也可以用作 lambda 表达式的参数名称 - 这就像一个未命名的函数。

在您的示例中sorted()aDict.items()生成的元组传递给它的key函数。 key 函数返回该元组的第一个元素, sorted()然后将其用作键,即要与其他值进行比较以确定顺序的值。

请注意,在这种情况下,可以在没有键函数的情况下产生相同的结果,因为元组是根据第一个元素自然排序的,然后是第二个元素,依此类推。所以

sorted(aDict.items())

将产生相同的结果。 因为字典不能包含重复的键,每个元组的第一个元素是唯一的,所以排序时从不考虑第二个元素。

让我们把它分开。

1) 假设你有一个 dict, di:

di={'one': 1, 'two': 2, 'three': 3}

2)现在假设你想要它的每个键值对:

 >>> di.items()
 [('three', 3), ('two', 2), ('one', 1)]

3)现在你想对它们进行排序(因为字典是无序的):

>>> sorted(di.items())
[('one', 1), ('three', 3), ('two', 2)]

请注意,元组按字典顺序排序——按元组第一个元素中的文本排序。 这相当于一系列元组的t[0]

假设您希望它按数字排序。 你会使用一个key函数:

>>> sorted(di.items(), key=lambda t: t[1])
[('one', 1), ('two', 2), ('three', 3)]

sorted(aDict.items(), key=lambda _: _[0])的语句sorted(aDict.items(), key=lambda _: _[0])只是使用_作为变量名。 它也不做任何事情,因为aDict.items()产生元组,如果你没有使用键,它无论如何都会按元组的第一个元素排序。 您示例中的 key 函数完全没用。

表单(元组除外)可能需要考虑一个用例。 如果您有字符串,那么您将按第一个字符排序并忽略其余字符:

>>> li=['car','auto','aardvark', 'arizona']
>>> sorted(li, key=lambda c:c[0])
['auto', 'aardvark', 'arizona', 'car']

对比:

>>> sorted(li)
['aardvark', 'arizona', 'auto', 'car']

但是,我仍然不会在 lambda 中使用_ _的使用是用于具有最小副作用机会的 throway 变量。 Python 的命名空间主要使这种担心不是真正的担心。

考虑:

>>> c=22
>>> sorted(li, key=lambda c:c[0])
['auto', 'aardvark', 'arizona', 'car']
>>> c
22

由于lambda内部的本地命名空间, c的值得以保留。

但是(在 Python 2.x 但不是 Python 3.x 下)这可能是一个问题:

>>> c=22
>>> [c for c in '123']
['1', '2', '3']
>>> c
'3'

因此(轻量级)约定变成在列表理解或元组扩展等情况下使用_作为变量,您不必担心践踏您的名字之一。 消息是:如果它被命名为_ ,我真的不关心它,除了在这里......

在 Python 中,lambda 用于创建匿名函数。 您示例中的第一个下划线只是 lambda 函数的参数。 在冒号(即函数签名)之后, _[0]检索变量_的第一个元素。

诚然,这可能令人困惑。 您示例的 lambda 组件可以重写为lambda x: x[0] ,结果相同。 但是,通常情况下,Python 中的下划线变量名称用于“一次性变量”。 在这种情况下,它意味着我们在每个字典项中唯一关心的就是键。 细微到一个错误,也许。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM