나는 OOP 배경에서 왔으며 파이썬을 배우려고합니다. I가 사용하고 max
타입의 인스턴스 반환 람다 식을 사용하는 기능을 Player
갖는 최대 totalScore
리스트 중에서이 players
.
def winner():
w = max(players, key=lambda p: p.totalScore)
이 함수 Player
는 maximum 유형의 인스턴스를 올바르게 반환합니다 totalScore
. 다음 세 가지에 대해 혼란스러워합니다.
max
기능 은 어떻게 작동합니까? 그것이 취하는 주장은 무엇입니까? 설명서를 보았지만 이해하지 못했습니다.key
max 함수 에서 키워드 사용이란 무엇입니까 ? 나는 그것이sort
기능의 맥락에서 사용된다는 것을 안다.- 람다 표현의 의미? 읽는 법? 그들은 어떻게 작동합니까?
이것들은 모두 매우 개념적인 질문이지만 언어를 이해하는 데 도움이 될 것입니다. 설명 할 예제를 줄 수 있다면 도움이 될 것입니다. 감사
답변
lambda
익명 함수이며 다음과 같습니다.
def func(p):
return p.totalScore
이제 max
이된다 :
max(players, key=func)
그러나 def
명령문은 복합 명령문이므로 표현식이 필요한 곳에서는 사용할 수 없으므로 때때로 lambda
의문이 사용됩니다.
주 lambda
당신이의 return 문에 넣어했던 것과 동일합니다 def
. 따라서 내부에서 문을 사용할 수 없으며 lambda
표현식 만 허용됩니다.
무엇을 max
합니까?
최대 (a, b, c, … [, key = func])-> 값
반복 가능한 단일 인수로 가장 큰 항목을 반환하십시오. 두 개 이상의 인수를 사용하면 가장 큰 인수를 반환하십시오.
따라서 가장 큰 객체를 반환합니다.
어떻게 key
작동합니까?
기본적으로 Python 2 key
에서는 객체 유형에 따라 규칙 집합을 기준으로 항목을 비교 합니다 (예 : 문자열이 항상 정수보다 큼).
비교하기 전에 객체를 수정하거나 특정 속성 / 인덱스를 기준으로 비교하려면 key
인수 를 사용해야합니다 .
예 1 :
간단한 예를 들어, 문자열 형식의 숫자 목록이 있지만 해당 항목을 정수 값으로 비교하려고한다고 가정하십시오.
>>> lis = ['1', '100', '111', '2']
다음 max
은 원래 값을 사용하여 항목을 비교합니다 (문자열은 사전 식으로 비교되므로 '2'
출력으로 표시됨).
>>> max(lis)
'2'
정수 값으로 항목을 비교하려면 key
간단한 lambda
다음을 사용하십시오 .
>>> max(lis, key=lambda x:int(x)) # compare `int` version of each item
'111'
예 2 : max
튜플 목록에 적용
>>> lis = [(1,'a'), (3,'c'), (4,'e'), (-1,'z')]
기본적으로 max
첫 번째 색인으로 항목을 비교합니다. 첫 번째 인덱스가 같으면 두 번째 인덱스를 비교합니다. 내 예에서와 같이 모든 항목에는 고유 한 첫 번째 색인이 있으므로 이것을 답으로 얻을 수 있습니다.
>>> max(lis)
(4, 'e')
그러나 각 항목을 인덱스 1의 값으로 비교하려면 어떻게해야합니까? 단순 : 사용 lambda
:
>>> max(lis, key = lambda x: x[1])
(-1, 'z')
iterable에서 다른 유형의 객체를 포함하는 항목 비교 :
혼합 항목 목록 :
lis = ['1','100','111','2', 2, 2.57]
Python 2에서는 두 가지 유형의 항목을 비교할 수 있습니다 .
>>> max(lis) # works in Python 2
'2'
>>> max(lis, key=lambda x: int(x)) # compare integer version of each item
'111'
그러나 파이썬 3에서는 더 이상 그렇게 할 수 없습니다 :
>>> lis = ['1', '100', '111', '2', 2, 2.57]
>>> max(lis)
Traceback (most recent call last):
File "<ipython-input-2-0ce0a02693e4>", line 1, in <module>
max(lis)
TypeError: unorderable types: int() > str()
그러나 각 객체의 정수 버전을 비교할 때 작동합니다.
>>> max(lis, key=lambda x: int(x)) # or simply `max(lis, key=int)`
'111'
답변
의 단순화 된 버전 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
답변
최대 기능은 어떻게 작동합니까?
iterable에서 “가장 큰”항목을 찾습니다. 나는 그것이 무엇인지 찾아 볼 수 있다고 가정하지만 그렇지 않은 경우 목록이나 문자열과 같이 반복 할 수있는 것입니다.
max 함수에서 키워드 키를 사용하는 것은 무엇입니까? 정렬 기능과 관련하여도 사용됩니다.
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
.
반복자는 목록, 튜플, 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])
max (arg1, arg2, * args [, key])
iterable 또는 2 개 이상의 인수 중 가장 큰 항목을 리턴합니다.하나의 위치 인수가 제공되면 iterable은 비어 있지 않은 iterable이어야합니다 (예 : 비어 있지 않은 문자열, 튜플 또는 목록). iterable에서 가장 큰 항목이 반환됩니다. 둘 이상의 위치 인수가 제공되면 가장 큰 위치 인수가 리턴됩니다.
선택적 키 인수는 list.sort ()에 사용되는 것과 같은 하나의 인수 순서 함수를 지정합니다. 키 인수가 제공되는 경우 키워드 형식이어야합니다 (예 : max (a, b, c, key = func)).
이것이 말하는 것은 귀하의 경우,이 경우 목록을 제공한다는 것 players
입니다. 그런 다음이 max
함수는 목록의 모든 항목을 반복하고 서로 비교하여 “최대 값”을 얻습니다.
당신이 상상할 수 있듯이, player
비교를위한 값을 결정하는 것과 같은 복잡한 객체를 사용하는 것은 까다롭기 때문에 함수가 각각의 값 key
을 결정하는 방법을 결정하는 인수 가 제공 max
됩니다 player
. 이 경우 “각 말할 수있는 람다 함수 사용 p
에 players
GET p.totalscore
그 비교를 위해 자신의 값으로 사용을”.
답변
max
첫 번째 인수 iterable
(목록 또는 튜플과 같은) 를 취하는 함수가 내장되어 있습니다.
키워드 인수 key
에는 기본값이 None
있지만 평가할 함수를 받아들이고 함수를 기반으로 반복 가능하게 평가하는 래퍼로 간주하십시오.
이 예제 사전을 고려하십시오.
d = {'aim':99, 'aid': 45, 'axe': 59, 'big': 9, 'short': 995, 'sin':12, 'sword':1, 'friend':1000, 'artwork':23}
전의:
>>> max(d.keys())
'sword'
kwarg (함수 key
) 없이 iterable 만 전달하면 알 수 있듯이 키의 최대 값을 (알파벳순으로) 반환합니다
전의. 알파벳 순으로 키의 최대 값을 찾는 대신 키 길이로 최대 키를 찾아야 할 수도 있습니다.
>>>max(d.keys(), key=lambda x: len(x))
'artwork'
이 예제에서 람다 함수는 반복되는 키의 길이를 반환하므로 알파벳순으로 고려하는 대신 값을 평가하는 동안 키의 최대 길이를 추적하고 최대 길이의 키를 반환합니다
전의.
>>> max(d.keys(), key=lambda x: d[x])
'friend'
이 예제에서 람다 함수는 최대 값을 갖는 해당 사전 키의 값을 반환합니다.