Python Lambda函数作为一个小函数参数

Python Lambda函数作为一个小函数参数,python,lambda,Python,Lambda,我正在做一些关于贪婪算法的教程,遇到了在sorted()中作为关键参数传递的lambda函数。我原以为我了解它们是如何工作的(在像lambda,b:a+b这样的简单示例上),但现在我很困惑,为什么最后一行行是test\u greedy(foods,max\u cost,lambda x:1/Food.get\u cost(x))。 我知道必须传递x,因为self,它实际上是类型食物。我不清楚的是x如何以及何时被实例化 以下是守则的相关部分: class Food: def __init_

我正在做一些关于贪婪算法的教程,遇到了在sorted()中作为关键参数传递的
lambda
函数。我原以为我了解它们是如何工作的(在像
lambda,b:a+b
这样的简单示例上),但现在我很困惑,为什么最后一行行是
test\u greedy(foods,max\u cost,lambda x:1/Food.get\u cost(x))
。 我知道必须传递
x
,因为
self
,它实际上是类型
食物。我不清楚的是
x
如何以及何时被实例化

以下是守则的相关部分:

class Food:
    def __init__(self, name, value, weight):
        self.name = name
        self.value = value
        self.calories = weight

    def get_value(self):
        return self.value

    def get_cost(self):
        return self.calories

def greedy(items, max_cost, key_function):
    """
    key_function maps elements of items to numbers, tells what is meant by "BEST"
    """
    items_copy = sorted(items, key = key_function, reverse = True)

    result = []
    total_value, total_cost = 0.0, 0.0

    for i in range(len(items_copy)):
        if (total_cost+items_copy[i].get_cost()) <= max_cost:
            result.append(items_copy[i])
            total_cost += items_copy[i].get_cost()
            total_value += items_copy[i].get_value()

    return (result, total_value)

def use_greedy(max_cost):
    print("Use greedy by cost to allocate", max_cost, "calories")
    test_greedy(foods, max_cost, lambda x: 1/Food.get_cost(x))
类食品:
定义初始值(自身、名称、值、重量):
self.name=名称
自我价值=价值
自身热量=体重
def get_值(自身):
回归自我价值
def获取成本(自身):
返回自己的卡路里
def贪婪(项目、最大成本、关键功能):
"""
按键功能将项目元素映射到数字,告诉“最佳”的含义
"""
项目\复制=排序(项目,键=键\函数,反向=真)
结果=[]
总价值,总成本=0.0,0.0
对于范围内的i(len(项目\副本)):

如果(total_cost+items_copy[i].get_cost())调用
test_greedy
并将其作为参数时,将计算lambda。它成为分配给
键函数的函数描述符
。请注意,
x
此时仍然是一个未绑定的参数

当您稍后将该函数作为排序键传递给排序后的
sorted
时,将调用该函数来评估
项的元素之间的每个比较。一个接一个地,它们作为
x
传递以进行评估,其中
1/食物。get_cost(x)
是用于对元素进行排序的数值


这就清楚了吗?

假设
test\u greedy
函数调用
greedy
函数和
foods
作为
items
参数,lambda将与
items\u copy=sorted(items,key=key\u function,reverse=True)中的
foods
的每个元素一起调用,现在有道理了。它仅在
使用中传递(未调用)
。感谢您的澄清。注意,它应该是
lambda x:1/x.get_cost()
@juanpa.arrivillaga我同意,我只是把原始代码放在这里,可能是为了弄清楚方法的定义,因为它是一个学习示例。但是是的,它应该被纠正。