Лямбда-функция как небольшой аргумент функции - PullRequest
1 голос
/ 06 мая 2020

Я делаю учебник по жадным алгоритмам и наткнулся на функцию lambda, переданную как ключевой параметр в sorted (). Я думал, что понял, как они работают (на простых примерах вроде lambda a,b: a+b), но теперь я запутался, почему последняя строка работает test_greedy(foods, max_cost, lambda x: 1/Food.get_cost(x)). Я понимаю, что x должно быть передано из-за self, и на самом деле это тип Food. Мне неясно, как и когда создается 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))

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Предполагая, что функция test_greedy вызывает функцию greedy с foods в качестве аргумента items, лямбда будет вызываться с каждым элементом foods в items_copy = sorted(items, key = key_function, reverse = True).

1 голос
/ 06 мая 2020

Лямбда вычисляется, когда вы вызываете test_greedy с этим в качестве аргумента. Он становится дескриптором функции, присвоенным key_function. Обратите внимание, что x все еще является несвязанным параметром на данный момент.

Когда вы позже передадите эту функцию в sorted в качестве ключа сортировки, , затем , она будет вызвана для оценки каждого сравнения между элементы items. Один за другим они передаются как x для оценки, где 1/Food.get_cost(x) - числовое значение, используемое для сортировки элементов.

Это проясняет?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...