在阅读一些代码时,我遇到了下面的代码片段,我无法理解.是否有人能够指导/提供提示/链接或下面第3行的基本解释
def do_store(*args, **kwargs):
try:
key = (args, tuple(sorted(kwargs.items(), key=lambda i:i[0])))
results = f._results
Run Code Online (Sandbox Code Playgroud)
主要是,以下是做什么的?
key=lambda i:i[0]
Run Code Online (Sandbox Code Playgroud)
Jas*_*per 12
使用lambda关键字,您可以创建"匿名函数".它们没有(也不需要)名称,因为它们会立即(通常)分配给回调函数.
lambda i:i[0]
Run Code Online (Sandbox Code Playgroud)
只是功能的主体
def f(i):
return i[0]
Run Code Online (Sandbox Code Playgroud)
函数的key参数sorted必须是计算给定项的排序键的函数.您还可以传递f上面定义的函数(名称),或使用lambda函数以获得更好的可读性.
正如tobias_k的回答所述,在这段代码中,整个key参数都是无用的.
其他答案已经很好地解释了什么lambda以及sorted的key参数做.简而言之:
key用于为排序提供比较键函数,让我们将其称为f,这样如果f(x)<f(y),则x将出现在排序列表中的y之前.lambda创建了一个快速而整齐的方式这样的功能,而无需创建一个def只为一个排序; 你也可以使用任何其他功能(你自己的定义,内置等)但是,回答问题是什么key=lambda i:i[0],在你的代码中:什么都没有!
更确切地说,它告诉sorted按列表中要排序的元组的第一个元素进行排序,这是由元组kwargs.items()列表产生的(key, value).但是,按第一个元素排序是元组的默认排序行为,只有当它们相等时,它才会按第二个元素排序,依此类推.但由于这些是(keys, values)字典,因此没有两个具有相同第一个元素的元组,因此使用此特定键函数与默认排序完全相同.
你也可以使用key = (args, tuple(sorted(kwargs.items()))).
如果你问它为什么这样做:这个函数似乎用于memoization,将函数参数(存储在args和中kwargs)映射到先前计算的值.为此,kwargs字典必须转换为元组,因为字典不可清除,即它不能用作另一个字典的键.并且为了确保相同的字典始终产生相同的元组,必须对其进行排序,因为字典是无序的.
写这个的三种等价方式:
sorted(kwargs.items(), key=lambda i:i[0])
Run Code Online (Sandbox Code Playgroud)
(你拥有的那个)
def first_item(aList): return aList[0]
sorted(kwargs.items(), key=first_item)
from operator import itemgetter
sorted(kwargs.items(), key=itemgetter(0))
Run Code Online (Sandbox Code Playgroud)
在所有情况下,参数key都传递一个函数,该函数接受一个参数并返回该参数的第一个元素.
lambda只是一种简写,避免给函数命名.赋予函数名称可以帮助人们阅读代码,尤其是在表达式更复杂的情况下.该itemgetter功能具有轻微的速度优势,但不能灵活,只需返回一个或多个项目; 如果你想进一步操纵物品(例如小写它们)你必须使用def或者lambda.
| 归档时间: |
|
| 查看次数: |
947 次 |
| 最近记录: |