Python 고급 함수
Python은 사용자 정의 고급 함수를 정의할 수 있도록 합니다.사실 나는 지난 파이톤lambda functions에 관한 글에서 이 특성을 보여 주었다.본문에서 나는 이 특정한 기능을 소개하지 않을 것이다.그러나 Python에 내장된 가장 유용한 고급 함수 3개를 소개합니다.
지도.
Python의 맵 함수는 원시iterable 대상에서 새로운iterable 대상을 생성할 수 있도록 합니다.그것은 두 개의 인자가 있다. 하나는 함수와iterable 대상이다.map 함수는iterable의 모든 구성원에게 전달되는 함수를 여기에 적용하고 맵 대상을 생성합니다.이 물체는 우리가 선택한 적당한 유형으로 변환될 수 있다.맵 대상에게 전달되는 함수는 값을 되돌릴 필요가 없습니다. (뒤에서 보여 드리겠습니다.)
구현
우리의 예시에서, 우리는 초기 목록 (L1) 에서 새로운 목록 (L2) 을 생성해서, L2의 모든 요소가 L1에 대응하는 요소의 두 배가 되도록 한다.다음은 우리가 지도 기능을 통해 이 점을 어떻게 실현하는가이다.
def double(x):
return x * 2
L1 = [3, 1, 4, 22, 45, 1, 245, 6, 34, 4, 8, 14]
L2 = list(map(double, L1))
print("Doubled Numbers: {}".format(L2))
# [6, 2, 8, 44, 90, 2, 490, 12, 68, 8, 16, 28]
위의 코드는 더블 함수 (괄호를 생략한 것) 와 원시 목록 (L1) 을 전달합니다.맵 대상을 되돌려주고 목록으로 변환합니다.이 맵의 대상을 우리가 원하는 모든 종류의iterable (목록, 모듈, 집합 등) 으로 강제로 변환할 수 있습니다.map 함수도 lambda 함수에 적용됩니다.위의 코드를 보다 촘촘하게 만들기 위해 다음과 같이 다시 작성할 수 있습니다.
L1 = [3, 1, 4, 22, 45, 1, 245, 6, 34, 4, 8, 14]
L2 = list(map( (lambda x : x * 2) , L1))
print(L2)
만약 맵 함수가 매우 간단하고 프로그램의 다른 곳에서 필요하지 않다면 이것은 더욱 이상적인 해결 방안이 될 것이다.단, 만약iterable에서 복잡한 조작을 실행하고 있거나, 이 상하문 밖에서 이 함수를 다시 사용할 계획이라면, 일반적인 함수를 사용하는 것이 좋습니다.내가 말했듯이 함수는 사실상 어떤 것도 되돌릴 필요가 없다.일부 기능을iterable의 모든 구성원에게 비추지만 생성된 맵 대상에 무관심하면 맵 함수는 원시iterable의 모든 대응하는 구성원에게None을 되돌려줍니다.
사실 우리는 되돌아오는 맵 대상을 저장할 필요조차 없다.만약 우리가 명단이 있다면, 우리는 명단에 있는 모든 사람을 위해 인사말을 인쇄하고 싶을 뿐, 우리는 지도 기능을 사용할 수 있다.
def greet(person):
print("Hello, {}!".format(person['name']))
people = [
{ 'name' : 'John Doe', 'age' : 20},
{ 'name' : 'Mike Will', 'age' : 10},
{ 'name' : 'Jane Hill', 'age' : 18},
{ 'name' : 'Alan Smith', 'age' : 16},
{ 'name' : 'Chimuka Chinene', 'age' : 18},
]
list(map(greet, people ))
""" Prints :
Hello, John Doe!
...
Hello, Chimuka Chinene!
"""
모든 구성원이 함수를 실제적으로 실행할 수 있도록 되돌아오는 맵 대상을 강제로 변환해야 합니다.생성된 목록은 맵퍼 함수가 어떤 내용도 되돌려주지 않았기 때문에 형식이 없는 대상의 목록입니다.이 목록을 변수에 지정하여 인쇄하면 출력 결과는 다음과 같습니다. [None, None, None, None, None, None, None]사용
map 함수의 가장 뚜렷한 용도는 해시 테이블을 만드는 것입니다.해시표는 하나의 키를 이 키를 사용하여 생성된 해시와 연결시키는 데이터 구조이다.map 함수는 키 목록에 해시 함수를 적용할 수 있으며, 교체할 필요가 없습니다.
map 함수도 순환을 바꾸는 데 사용할 수 있습니다.우리는iterable의 모든 구성원을 훑어보고 일부 논리를 실행할 필요가 없고, 이 논리를 가진 함수를iterable에 비출 수 있다.맵퍼 함수에서 어떤 것도 되돌려줄 필요도, 생성된 맵 대상에 신경 쓸 필요도 없다는 것을 명심해라.
줄다
reduce 함수의 작업 원리는 맵 함수와 유사합니다. 하나의iterable를 받아들이고iterable에 적용되는 모든 구성원의 함수를 받아들이기 때문입니다.그러나 맵과는 다르다. 원시적인iterable 맵이 아닌 값을 되돌려주기 때문이다.이것은iterable를 값으로 낮춥니다.reduce 함수는 세 번째 인자, 즉 교체가 시작될 때 사용하는 초기 값을 받아들인다.이 값을 제공하지 않으면iterable의 첫 번째 요소를 초기 값으로 사용합니다.매번 교체할 때마다 이 함수는 현재 값과iterable의 다음 구성원을 가져오고 다음 요소에 사용할 값을 되돌려줍니다.
구현
정수 배열 L1에 있는 모든 숫자의 이중 정밀도 합을 계산합니다.우리는 하나의 회로로 이 일을 할 수 있다.그러나 더 간결한 해결 방안은 다음과 같은 Reduce 함수를 사용하는 것이다. Python3에서 Reduce가functools로 이동했기 때문에 가져와야 한다.
from functools import reduce
def addDoubles(a, b):
return a + (b * 2)
L1 = [3, 1, 4, 22, 45, 1, 245, 6, 34, 4, 8, 14]
doubleSum = reduce(addDoubles, L1, 0)
print(doubleSum) # 774
위 코드에서dd 함수는 두 가지 인자가 있습니다: 현재와 (a),iterable (b) 의 현재 요소, 후자는 두 배입니다.두 배와 현재 총화의 총계를 되돌려주고, 이를iterable가 끝날 때까지 다음 교체로 돌려줍니다.reduce 함수도 lambda 함수를 받아들인다.위의 코드를 다음과 같이 간략화할 수 있습니다.from functools import reduce
L1 = [3, 1, 4, 22, 45, 1, 245, 6, 34, 4, 8, 14]
doubleSum = reduce( (lambda a,b : a + b * 2) , L1, 0)
print(doubleSum) # 774
이것은 간단한 예로, 우리는 더욱 복잡한 Reducer 함수를 정의할 수 있다.우리도 다른 초기 값을 선택할 수 있다.예를 들어, 내 시작점이 1000이었으면 하는 경우 코드를 다른 방법으로 작성합니다.from functools import reduce
L1 = [3, 1, 4, 22, 45, 1, 245, 6, 34, 4, 8, 14]
sum = reduce( (lambda a,b : a + b * 2) , L1, 1000) # 1000 as initial value
print(sum) # 1774
사용reduce 함수는iterable를 하나의 값으로 집합해야 하는 어느 곳에서든 사용할 수 있습니다.우리는 감축 함수를 마음대로 정의할 수 있다.
필터
필터 함수도 맵 함수와 유사하다.이것은iterable와 iterable의 모든 구성원에서 실행되는 함수를 받아들인다.그러나 다음과 같은 몇 가지 규칙이 있습니다.
구현
18세 이하의 모든 사람을 거르기 위해 5명의 명단을 제시해라.
def legal(person):
return person['age'] >= 18
people = [
{ 'name' : 'John Doe', 'age' : 20},
{ 'name' : 'Mike Will', 'age' : 10},
{ 'name' : 'Jane Hill', 'age' : 18},
{ 'name' : 'Alan Smith', 'age' : 16},
{ 'name' : 'Chimuka Chinene', 'age' : 18},
]
legal_people = list(filter(legal, people))
print(legal_people)
""" Prints [{'name': 'John Doe', 'age': 20}, {'name': 'Jane Hill', 'age': 18}, #{'name': 'Chimuka Chinene', 'age': 18}] """
위의 코드에서, 우리는 모든 사람에게 법률 기능을 실행한다.이 함수는 사람의 나이에 따라 True 또는 False를 반환합니다.나이가 법적 기능에서 진실로 회복된 사람만이 새로운 명단에 들어갈 수 있다.필터 대상을 되돌려줍니다.우리는 그것을 우리가 원하는 어떤 유형에 투사할 수 있다.filter 함수도 lambda 함수를 매개 변수로 사용할 수 있습니다.위의 코드는 다음과 같이 작성할 수 있습니다.
people = [
{ 'name' : 'John Doe', 'age' : 20},
{ 'name' : 'Mike Will', 'age' : 10},
{ 'name' : 'Jane Hill', 'age' : 18},
{ 'name' : 'Alan Smith', 'age' : 16},
{ 'name' : 'Chimuka Chinene', 'age' : 18},
]
legal_people = list(filter( (lambda person : person['age'] >= 18) , people))
print(legal_people)
""" Prints [{'name': 'John Doe', 'age': 20}, {'name': 'Jane Hill', 'age': 18}, #{'name': 'Chimuka Chinene', 'age': 18}] """
사용이 조항은 매우 단도직입적이다.원본 목록에 필요하지 않은 구성원을 필터하려고 하는 경우 필터 함수를 사용합니다.우리는iterable에서 매우 복잡한 요소에서 그것을 실행하고 복잡한 필터 함수를 정의하여 우리가 원하는 결과를 실현할 수 있습니다.Filter 함수는 True 또는 False를 반환해야 합니다.
결론
프로그램을 작성할 때, 고급 함수는 매우 귀중한 도구이며, 특히 이식 가능한 대상을 처리하는 프로그램이다.그것들의 기능은 일반적인 for/while 순환을 통해 실현될 수 있기 때문에 필수적이지 않다.그러나 일반적인 순환에 비해 코드를 깔끔하고 간결하게 유지하는 데 큰 도움이 된다.나는 내가 상술한 기능에 대해 충분한 설명을 제공했기 때문에 당신이 프로젝트에서 그것들을 실현할 수 있기를 바랍니다.즐거운 코딩!
게시물Python Higher-Order Functions이 가장 먼저Kelvin Mwinuka에 올라왔다.
만약 당신이 이 글을 좋아한다면, 나의 내용이 발표되기 전에 가능한 한 빨리 방문할 수 있도록 나를 따라오는 것을 고려할 수 있다. (걱정하지 마라. 그것은 여전히 무료이며, 짜증나는 팝업 광고가 없다.)또한 이 문장을 마음대로 평론해 주십시오.나는 너의 생각을 매우 듣고 싶다.
Reference
이 문제에 관하여(Python 고급 함수), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kelvinvmwinuka/python-higher-order-functions-3co텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)