Я родом из ООП и пытаюсь изучить Python. Я использую max
функцию, которая использует лямбда-выражение для возврата экземпляра типа, Player
имеющего максимум totalScore
среди списка players
.
def winner():
w = max(players, key=lambda p: p.totalScore)
Функция корректно возвращает экземпляр типа, Player
имеющий максимум totalScore
. Я запутался в следующих трех вещах:
- Как работает
max
функция? Какие аргументы он принимает? Я посмотрел на документацию, но не смог понять. - Какая польза от ключевого слова
key
в функции max? Я знаю, что это также используется в контекстеsort
функции - Значение лямбда-выражения? Как их читать? Как они работают?
Все это очень нудистские концептуальные вопросы, но они помогут мне понять язык. Было бы полезно, если бы вы могли привести примеры, чтобы объяснить. Спасибо
python max lambda
и, возможно, может быть более полезной для новых пользователей.Ответы:
lambda
является анонимной функцией, это эквивалентно:Теперь
max
становится:Но поскольку
def
операторы являются составными, их нельзя использовать там, где требуется выражение, поэтому иногдаlambda
они используются.Обратите внимание, что
lambda
это эквивалентно тому, что вы бы указали в операторе возвратаdef
. Таким образом, вы не можете использовать операторы внутриlambda
, допускаются только выражения.Что делает
max
?Таким образом, он просто возвращает объект, который является самым большим.
Как
key
работает?По умолчанию в Python 2
key
сравниваются элементы на основе набора правил, основанных на типе объектов (например, строка всегда больше целого числа).Чтобы изменить объект перед сравнением или сравнить на основе определенного атрибута / индекса, вы должны использовать
key
аргумент.Пример 1:
Простой пример. Предположим, у вас есть список чисел в строковой форме, но вы хотите сравнить эти элементы по их целочисленным значениям.
Здесь
max
сравниваются элементы, используя их исходные значения (строки сравниваются лексикографически, так что вы получите'2'
результат):Для сравнения элементов по их целочисленному значению используйте
key
простоеlambda
:Пример 2. Применение
max
к списку кортежей.По умолчанию
max
будут сравниваться элементы по первому индексу. Если первый индекс совпадает, тогда он будет сравнивать второй индекс. Как и в моем примере, все элементы имеют уникальный первый индекс, поэтому вы получите ответ:Но что, если вы хотите сравнить каждый элемент по значению с индексом 1? Просто: используйте
lambda
:Сравнение элементов в итерируемом объекте, который содержит объекты различного типа :
Список со смешанными предметами:
В Python 2 можно сравнивать элементы двух разных типов :
Но в Python 3 вы больше не можете этого делать :
Но это работает, так как мы сравниваем целочисленную версию каждого объекта:
источник
lengths = map(lambda word: len(word), words)
гдеwords=['It', 'is', 'raining', 'cats', 'and', 'dogs']
я вижу, что лямбда выполняет итерацию по каждому слову в списке. Всегда ли это так?max
notlambda
(key
arg является необязательным), и во время итерации каждый элемент передается в функцию, указанную в,key
и возвращаемое значение затем используется для сравнения.max(lis, key=lambda x:int(x))
можно упростить какmax(lis, key=int)
. Python имеет встроенную функцию int (). Точно так же вы можете использовать любые другие встроенные функции в качествеkey
аргумента. Например , вы можете получить самую длинную строку изlis=['a', 'aa', 'aaa']
поmax(lis, key=len)
max
,min
иsorted
т. Д. Должным образом. Плюс я упомянулmax(lis, key=int)
прямо в конце. :-)Сильно упрощенная версия
max
:Относительно лямбды:
источник
Он ищет «самый большой» элемент в итерируемом. Я предполагаю, что вы можете посмотреть, что это такое, но если нет, то это то, что вы можете зациклить, то есть список или строку.
Key
является лямбда-функцией, которая сообщает,max
какие объекты в итерируемом объекте больше других. Скажем, если вы сортировали какой-то объект, который создали сами, а не что-то очевидное, например целые числа.Это своего рода большой вопрос. Проще говоря, лямбда-это функция, которую вы можете передавать , и другие кусочки кода используют ее. Возьмите это к примеру:
Это берет два объекта,
a
иb
, и функциюf
. Он вызываетf()
каждый объект, а затем складывает их вместе. Итак, посмотрите на этот вызов:sum()
берет2
и вызывает лямбда-выражение на нем. Такf(a)
становится2 * 2
, что становится 4. Затем он делает этоb
и складывает их вместе.В не очень простых терминах, лямбда происходит из лямбда-исчисления, которое является идеей функции, которая возвращает функцию; очень крутая математическая концепция для выражения вычислений. Вы можете прочитать об этом здесь , а затем действительно понять это здесь .
Вероятно, лучше прочитать об этом немного больше, поскольку лямбды могут сбивать с толку, и не сразу очевидно, насколько они полезны. Проверьте здесь .
источник
max
Функция используется, чтобы получить максимум изiterable
.Итераторами могут быть списки, кортежи, объекты dict и т. Д. Или даже пользовательские объекты, как в приведенном вами примере.
Таким образом, в
key=func
основном, мы можем передать необязательный аргументkey
функции, на основе которой сортируются данные итераторы / аргументы и возвращается максимум.lambda
это ключевое слово python, которое действует как псевдо-функция. Итак, когда вы передадите емуplayer
объект, он вернетсяplayer.totalScore
. Таким образом, переданный итератор к функцииmax
будет сортировать поkey
totalScore изplayer
объектов , предоставленных ему и вернетplayer
кто имеет максимумtotalScore
.Если
key
аргумент не указан, максимум возвращается в соответствии с порядком Python по умолчанию.Примеры -
источник
Согласно документации :
Это говорит о том, что в вашем случае вы предоставляете список, в данном случае
players
. Затемmax
функция будет перебирать все элементы в списке и сравнивать их друг с другом, чтобы получить «максимум».Как вы можете себе представить, с таким сложным объектом, как
player
определение его значения для сравнения, сложно, поэтому вам даютkey
аргумент, чтобы определить, какmax
функция будет определять значение каждого из нихplayer
. В этом случае вы используете лямбда-функцию, чтобы сказать «для каждогоp
вplayers
getp.totalscore
и использовать это как его значение для сравнения».источник
max
встроена функция, которая принимает первый аргумент aniterable
(например, список или кортеж)Аргумент ключевого слова
key
имеет значение по умолчанию,None
но он принимает функцию для оценки, рассматривает ее как оболочку, которая вычисляет итерацию на основе функцииРассмотрим этот пример словаря:
Пример:
Как вы можете видеть, если вы передаете итерацию только без kwarg (функция
key
), она возвращает максимальное значение ключа (в алфавитном порядке)Ex. Вместо нахождения максимального значения ключа в алфавитном порядке, вам может потребоваться найти максимальный ключ по длине ключа:
в этом примере лямбда-функция возвращает длину ключа, которая будет повторяться, следовательно, при оценке значений, а не в алфавитном порядке, она будет отслеживать максимальную длину ключа и возвращает ключ с максимальной длиной.
Ex.
в этом примере лямбда-функция возвращает значение соответствующего словарного ключа, который имеет максимальное значение
источник