функция python max с использованием "ключа" и лямбда-выражения
я прихожу из фона ООП и пытаюсь изучить python.
Я использую max
функция, которая использует лямбда-выражение возвращает экземпляр типа Player
максимум totalScore
в списке players
.
def winner():
w = max(players, key=lambda p: p.totalScore)
функция правильно возвращает экземпляр типа Player
максимум totalScore
.
Меня смущают следующие три вещи:--11-->
- каким образом
max
функции работу? Какие аргументы он принимает? Я посмотрел на документация, но не удалось понять. - Что такое использование ключевого слова
key
в функции Max? Я знаю, что он также используется в контекстеsort
функции - значение лямбда-выражения? Как их читать? Как они работают?
это все очень 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'
в этом примере лямбда-функция возвращаемое значение соответствующего словарного ключа, имеющего максимальное значение