функция python max с использованием "ключа" и лямбда-выражения

я прихожу из фона ООП и пытаюсь изучить python. Я использую max функция, которая использует лямбда-выражение возвращает экземпляр типа Player максимум totalScore в списке players.

def winner():
    w = max(players, key=lambda p: p.totalScore)

функция правильно возвращает экземпляр типа Player максимум totalScore. Меня смущают следующие три вещи:--11-->

  1. каким образом max функции работу? Какие аргументы он принимает? Я посмотрел на документация, но не удалось понять.
  2. Что такое использование ключевого слова key в функции Max? Я знаю, что он также используется в контексте sort функции
  3. значение лямбда-выражения? Как их читать? Как они работают?

это все очень noobish концептуальные вопросы, но поможет мне понять язык. Было бы неплохо, если бы вы привели примеры для объяснения. Спасибо

6 ответов


lambda является анонимной функцией, она эквивалентна:

def func(p):
   return p.totalScore     

теперь max будет:

max(players, key=func)

, а как def операторы являются составными операторами, они не могут использоваться там, где требуется выражение, поэтому иногда lambdaиспользуются.

обратите внимание, что лямбда эквивалентна тому, что вы поместили бы в оператор return def. Таким образом, вы не можете использовать инструкции внутри lambda, только выражения допустимый.


что делает Макс?

max(a, b, c, ...[, key=func]) - > значение

С одним итерируемым аргументом верните его самый большой элемент. С двумя или больше аргументов, верните самый большой аргумент.

таким образом, он просто возвращает объект, который является самым большим.


How `key` works?

по умолчанию в Python 2 ключ сравнивает элементы на основе правила на основе типа объекты (например, строка всегда больше целого числа).

чтобы изменить объект перед сравнением или сравнить на основе определенного атрибута / индекса, вы должны использовать


сильно упрощенная версия max:

def max(items, key=lambda x: x):
    current = item[0]
    for item in items:
        if key(item) > key(current):
            current = item
    return current

по поводу лямбды:

>>> ident = lambda x: x
>>> ident(3)
3
>>> ident(5)
5

>>> times_two = lambda x: 2*x
>>> times_two(2)
4

как работает функция max?

он ищет "самый большой" элемент в iterable. Я предполагаю, что вы можете посмотреть, что это такое, но если нет, это то, что вы можете обойти, т. е. список или строка.

что польза ключа ключевого слова в максимальной функции? Я знаю, что он также используется в контексте функции сортировки

Key - это лямбда-функция, которая расскажет max какие объекты в iterable больше других. Скажем, если вы сортировали какой-то объект, который создали сами, а не что-то очевидное, например целые числа.

значение лямбда-выражения? Как их читать? Как они работают?

это большой вопрос. Проще говоря, лямбда-это функция, которую вы можете обойти, и другие части кода используют его. Возьмите это, например:

def sum(a, b, f):
    return (f(a) + f(b))

для этого требуется два объекта,a и b и f. Он зовет f() на каждом объекте, затем добавляет их вместе. Так что посмотрите на этот звонок:

>>> sum(2, 2, lambda a:  a * 2)
8

sum() принимает 2, и вызывает на нем лямбда-выражение. Так что f(a) становится 2 * 2, который становится 4. Затем он делает это для b, и добавляет два вместе.

в не столь простых терминах лямбда происходят из лямбда-исчисления, которое является идеей функции, возвращающей функцию; очень крутая математическая концепция для выражения вычисление. Вы можете прочитать об этом здесь, а затем понять это здесь.

вероятно, лучше прочитать об этом немного больше, так как лямбды могут сбивать с толку, и не сразу видно, насколько они полезны. Проверка здесь.


по словам документация:

max (iterable [, key])
max (arg1, arg2, *args[, key])
вернуть самый большой элемент в iterable или самый большой из двух или более аргументов.

если предоставлен один позиционный аргумент, iterable должен быть непустым iterable (например, непустая строка, кортеж или список). Большие предметы в метод возвращается. Если два или более позиционных аргументы при условии, возвращается самый большой из позиционных аргументов.

необязательный ключевой аргумент задает функцию упорядочения с одним аргументом как это используется для списка.род.)( Ключевым аргументом, если он указан, должен быть в форме ключевого слова (например, max (a,b,c,key=func)).

это означает, что в вашем случае вы предоставляете список, в этом случае players. Тогда max функция будет перебирать все элементы в списке и сравнивать их друг к другу, чтобы получить "максимум".

как вы можете себе представить, со сложным объектом, таким как player определение его значения для сравнения сложно, поэтому вам дается key аргумент, чтобы определить, как max функция будет решать значение каждого player. В этом случае вы используете лямбда-функцию, чтобы сказать "для каждого p на players get p.totalscore и используйте это как его значение для сравнения".


max функция используется, чтобы получить максимум из iterable.

итераторы могут быть списками, кортежами, объектами dict и т. д. Или даже пользовательские объекты, как в приведенном примере.

max(iterable[, key=func]) -> value
max(a, b, c, ...[, key=func]) -> value

With a single iterable argument, return its largest item.
With two or more arguments, return the largest argument.

Итак,key=func в основном позволяет нам передавать необязательный аргумент key функции, на основе которой сортируются заданные итератор/Аргументы и возвращается максимум.

lambda является ключевым словом python, которое действует как псевдо-функция. Так, когда вы проходите player объект к нему, он вернется player.totalScore. Таким образом, iterable перешел к функции max будет сортировать в соответствии с key totalScore на player объекты, данные ему и вернут player кто имеет максимум totalScore.

, если не key аргумент предоставляется, максимум возвращается в соответствии с порядками Python по умолчанию.

примеры -

max(1, 3, 5, 7)
>>>7
max([1, 3, 5, 7])
>>>7

people = [('Barack', 'Obama'), ('Oprah', 'Winfrey'), ('Mahatma', 'Gandhi')]
max(people, key=lambda x: x[1])
>>>('Oprah', 'Winfrey')

max встроенная функция, которая принимает первый аргумент iterable (например, список или кортеж)

аргумент ключевого слова key имеет значение по умолчанию None но он принимает функцию для оценки, рассматривает ее как оболочку, которая оценивает итерацию на основе функции

рассмотрим этот пример словаря:

d = {'aim':99, 'aid': 45, 'axe': 59, 'big': 9, 'short': 995, 'sin':12, 'sword':1, 'friend':1000, 'artwork':23}

Ex:

>>> max(d.keys())
'sword'

как вы можете видеть, если вы только передаете iterable без kwarg (функция в key) он возвращает максимум значение ключа (в алфавитном порядке)

Ex. Вместо нахождения максимального значения ключа в алфавитном порядке вам может потребоваться найти максимальный ключ по длине ключа:

>>>max(d.keys(), key=lambda x: len(x))
'artwork'

в этом примере лямбда-функция возвращает длину ключа, которая будет повторяться, следовательно, при оценке значений вместо рассмотрения в алфавитном порядке она будет отслеживать максимальную длину ключа и возвращает ключ, который имеет максимальную длину

Ex.

>>> max(d.keys(), key=lambda x: d[x])
'friend'

в этом примере лямбда-функция возвращаемое значение соответствующего словарного ключа, имеющего максимальное значение