어나니머스 함수
Anonymous function컴퓨터 프로그래밍에서 익명 함수(함수 리터럴, 람다 추상화, 람다 함수, 람다 식 또는 블록)는 식별자에 바인딩되지 않은 함수 정의입니다.어나니머스 함수는 종종 상위 함수에 전달되거나 [1]함수를 반환해야 하는 상위 함수의 결과를 구성하기 위해 사용되는 인수입니다.함수를 한 번만 또는 제한된 횟수만 사용하는 경우 익명 함수는 명명된 함수를 사용하는 것보다 구문적으로 가벼울 수 있습니다.어나니머스 함수는 기능 프로그래밍 언어 및 퍼스트 클래스 함수를 가진 다른 언어에서 흔히 볼 수 있으며, 여기서 리터럴이 다른 데이터 유형에 대해 수행하는 것과 동일한 역할을 수행합니다.
익명의 함수는 알론조 교회가 1936년 람다 미적분을 발명하면서 시작되었다.람다 미적분에서는 모든 함수가 익명으로 되어 있으며, 전자계산기 이전이다.[2] 몇몇 프로그래밍 언어에서 익명 함수는 키워드 lamda를 사용하여 도입되며, 익명 함수는 종종 lamdas 또는 lamda 추상화라고 불립니다.1958년 리스프 이후 익명 함수가 프로그래밍 언어의 특징이며, 익명 함수를 지원하는 현대 프로그래밍 언어가 증가하고 있습니다.
이름
"라다 추상화", "라다 함수", "라다 식"이라는 이름은 람다 미적분학의 함수 추상화 표기법에서 일반적인 함수 f(x) = M이 기록될 것이다.M) (M은 x를 사용하는 식입니다.)의 Python 구문과 비교해 보십시오.lambda x: M
.
"화살표 함수"라는 이름은 수학적인 "맵 대상" 기호인 x m M을 나타냅니다.의 JavaScript 구문과 비교해 보십시오.x => M
를 클릭합니다.[3]
사용하다
익명 함수는 이름이 필요 없는 기능을 포함하거나 단기간에 사용할 수 있습니다.몇몇 주목할 만한 예로는 클로징과 카레링이 있다.
익명 기능의 사용은 스타일의 문제입니다.이러한 함수를 사용하는 것만이 문제를 해결할 수 있는 유일한 방법은 아닙니다.각 익명 함수는 이름 있는 함수로 정의되어 이름으로 호출될 수 있습니다.일부 프로그래머는 익명 함수를 사용하여 재사용 불가능한 특정 코드를 캡슐화하고 많은 한 줄의 일반 함수와 함께 코드를 폐기하지 않습니다.
일부 프로그래밍 언어에서 익명 함수는 일반적으로 콜백에 대한 이벤트 바인딩이나 특정 값에 대한 함수 인스턴스화 등 매우 특정한 목적을 위해 구현됩니다.이러한 함수는 보다 일반적이고 이름 있는 함수를 호출하는 것보다 더 효율적이고 읽기 쉬우며 오류 발생 가능성이 적을 수 있습니다.
다음 예는 Python 3에 기재되어 있습니다.
정렬
비표준적인 방법으로 정렬을 시도할 경우 명명된 함수를 만드는 대신 정렬 로직을 익명 함수로 포함하는 것이 더 쉬울 수 있습니다.대부분의 언어는 임의의 개체를 정렬하는 정렬 알고리즘을 구현하는 일반 정렬 함수를 제공합니다.이 함수는 보통 두 요소가 동일한지 또는 한 요소가 다른 요소보다 크거나 작은지를 비교하는 방법을 결정하는 임의 함수를 받아들입니다.
문자열의 길이를 기준으로 문자열 목록을 정렬하는 다음 Python 코드를 고려하십시오.
>>> a = ['하우스', 카, '자전거] >>> a.종류(열쇠=람다 x: 렌(x)) >>> a [카, '자전거, '하우스']
이 예에서 익명 함수는 람다 식입니다.
람다 x: 렌(x)
anonymous 함수는 하나의 인수를 받아들입니다.x
인수의 길이를 반환합니다.이 길이는 에 의해 사용됩니다.sort()
method를 정렬 기준으로 사용합니다.
Python에서 람다 함수의 기본 구문은 다음과 같습니다.
람다 arg1, arg2, arg3, ...: < >작동 에 그 논쟁들 돌아오는 a 가치>
람다 함수에 의해 반환되는 식은 변수에 할당되어 코드에서 여러 위치에 사용할 수 있습니다.
>>> 더하다 = 람다 a: a + a >>> 더하다(20) 40
다른 예로는 목록의 항목을 클래스 이름으로 정렬하는 경우가 있습니다(Python에서는 모든 항목에 클래스가 있습니다).
>>> a = [10, '숫자', 11.2] >>> a.종류(열쇠=람다 x: x.__class__.__name__) >>> a [11.2, 10, '숫자']
주의:11.2
클래스 이름 "을 가지고 있습니다.float
",10
클래스 이름 "을 가지고 있습니다.int
", 및'number'
클래스 이름 "을 가지고 있습니다.str
". 정렬된 순서는 " 입니다.float
", "int
"그럼"str
".
폐쇄
폐쇄는 경계 변수를 포함하는 환경에서 평가되는 함수입니다.다음 예제에서는 입력을 임계값과 비교하는 어나니머스 함수로 변수 "임계값"을 바인딩합니다.
방어하다 컴포넌트(문턱값): 돌아가다 람다 x: x < > 문턱값
이는 일종의 비교 함수 생성기로 사용할 수 있습니다.
>>> 기능 = 컴포넌트(10) >>> 기능 = 컴포넌트(20) >>> 인쇄물(기능(5), 기능(8), 기능(13), 기능(21)) 진실의 진실의 거짓의 거짓의 >>> 인쇄물(기능(5), 기능(8), 기능(13), 기능(21)) 진실의 진실의 진실의 거짓의
가능한 모든 비교 함수에 대해 함수를 만드는 것은 비현실적이며, 더 이상 사용하기 위해 임계값을 유지하는 것이 너무 불편할 수 있습니다.폐쇄를 사용하는 이유에 관계없이 익명 함수는 비교를 수행하는 기능을 포함하는 엔티티입니다.
카레잉
커링은 함수를 변경하여 여러 입력을 받는 것이 아니라 하나의 입력을 받고 두 번째 입력을 받는 함수를 반환하는 과정입니다.이 예에서는 임의의 정수로 나눗셈을 수행하는 함수가 설정된 정수로 나눗셈을 수행하는 함수로 변환됩니다.
>>> 방어하다 나누다(x, y): ... 돌아가다 x / y >>> 방어하다 제수(d): ... 돌아가다 람다 x: 나누다(x, d) >>> 반 = 제수(2) >>> 셋째 = 제수(3) >>> 인쇄물(반(32), 셋째(32)) 16.0 10.666666666666666 >>> 인쇄물(반(40), 셋째(40)) 20.0 13.333333333333334
카레링에서는 익명의 기능을 사용하는 것이 일반적이지 않을 수 있지만 여전히 사용할 수 있습니다.위의 예에서 함수 제수는 지정된 제수를 사용하여 함수를 생성합니다.함수의 절반과 세 번째가 나눗셈 함수를 고정 제수로 커리링합니다.
또한 제수 함수는 변수를 바인딩하여 닫힘을 형성합니다.d
.
고차 함수
고차 함수는 함수를 인수로 사용하는 함수입니다.이것은 일반적으로 일반적으로 정의된 함수(종종 루프 구성 또는 재귀 방식)의 동작을 사용자 정의하기 위해 사용됩니다.익명 함수는 이러한 함수 인수를 지정하는 편리한 방법입니다.다음은 Python 3의 예입니다.
지도
맵 함수는 목록의 각 요소에 대해 함수 호출을 수행합니다.다음 예제에서는 익명 함수를 사용하여 배열의 모든 요소를 제곱합니다.
>>> a = [1, 2, 3, 4, 5, 6] >>> 목록.(지도(람다 x: x*x, a)) [1, 4, 9, 16, 25, 36]
어나니머스 함수는 인수를 받아들이고 인수를 직접 곱합니다(제곱).위의 형식은 아래에 제시된 형식이 동일한 의미를 가지며 언어의 철학과 더 일치한다고 주장하는 언어 창작자들에 의해 권장되지 않습니다.
>>> a = [1, 2, 3, 4, 5, 6] >>> [x*x 위해서 x 에 a] [1, 4, 9, 16, 25, 36]
필터
필터 함수는 특정 함수에 전달되었을 때 True를 평가하는 목록의 모든 요소를 반환합니다.
>>> a = [1, 2, 3, 4, 5, 6] >>> 목록.(필터(람다 x: x % 2 == 0, a)) [2, 4, 6]
어나니머스 함수는 전달된 인수가 짝수인지 여부를 확인합니다.지도와 마찬가지로 다음 형식이 더 적절하다고 간주됩니다.
>>> a = [1, 2, 3, 4, 5, 6] >>> [x 위해서 x 에 a 한다면 x % 2 == 0] [2, 4, 6]
접다
폴드 함수는 구조체의 모든 요소에 걸쳐 실행됩니다(일반적으로 왼쪽에서 오른쪽으로 나열되는 목록의 경우 "왼쪽 폴드"라고 함).reduce
Python에서) 값을 축적합니다.예를 들어 다음과 같이 구조물의 모든 요소를 하나의 값으로 결합할 수 있습니다.
>>> 부터 기능하다 수입품 줄이자 >>> a = [1, 2, 3, 4, 5] >>> 줄이자(람다 x,y: x*y, a) 120
이 동작은
여기서 어나니머스 함수는 두 인수를 곱한 것입니다.
폴드의 결과는 하나의 값일 필요는 없습니다.대신, 지도와 필터를 모두 접어서 만들 수 있습니다.맵에서 누적되는 값은 원래 목록의 각 요소에 함수를 적용한 결과를 포함하는 새 목록입니다.필터에서 누적되는 값은 지정된 조건과 일치하는 요소만 포함하는 새 목록입니다.
언어 목록
다음은 이름 없는 어나니머스 함수를 완전히, 또는 일부 변형으로 또는 전혀 지원하지 않는 프로그래밍 언어 목록입니다.
이 표는 몇 가지 일반적인 경향을 보여줍니다.첫째, 익명 함수(C, Pascal, Object Pascal)를 지원하지 않는 언어는 모두 정적으로 입력된 언어입니다.단, 정적으로 입력된 언어는 익명 기능을 지원할 수 있습니다.예를 들어 ML 언어는 정적으로 입력되며 기본적으로 익명 함수를 포함하며 오브젝트 파스칼의 방언인 델파이는 C++(C++11 표준에 따라)와 마찬가지로 익명 함수를 지원하도록 확장되었습니다.둘째, 함수를 퍼스트 클래스 함수로 취급하는 언어(Dylan, Haskell, JavaScript, Lisp, ML, Perl, Python, Ruby, Scheme)는 일반적으로 익명 함수를 지원하므로 함수를 다른 데이터 유형만큼 쉽게 정의하고 전달할 수 있습니다.
언어 | 지지하다 | 메모들 |
---|---|---|
액션 스크립트 | ||
아다 | 표현 함수는 Ada2012의 일부입니다. | |
알골 68 | ||
APL | Dyalog, ngn 및 dzaima APL은 dfns 및 암묵 기능을 모두 완전히 지원합니다.GNU APL은 dfns에 대한 지원이 다소 제한되어 있습니다. | |
어셈블리 언어 | ||
배쉬 | Bash에서 [4]익명 기능을 지원하기 위해 라이브러리가 만들어졌습니다. | |
C | 지원은 Clang 및 LLVM 컴파일러-rt lib와 함께 제공됩니다.GCC는 사용 가능성을 가능하게 하는 매크로 구현에 대해 지원됩니다.자세한 것은, 이하를 참조해 주세요. | |
C# | [5] | |
C++ | C++11 기준 | |
CFML | Railo [6]4, ColdFusion 10[7] 현재 | |
클로쥬르 | [8] | |
코볼 | Micro Focus의 비표준 Managed COBOL 방언은 익명 위임/[9]메서드라고 하는 람다를 지원합니다. | |
컬 | ||
D | [10] | |
다트 | [11] | |
델파이 | [12] | |
딜런 | [13] | |
에펠 | ||
느릅나무 | [14] | |
엘릭시르 | [15] | |
얼랑 | [16] | |
F# | [17] | |
엑셀 | Excel 워크시트 기능, 2021 베타[18] 릴리즈 | |
요인 | 이를 뒷받침하는[19] '인용' | |
포트란 | ||
프링크 | [20] | |
가세요 | [21] | |
고수 | [22] | |
그루비 | [23] | |
하스켈 | [24] | |
Haxe | [25] | |
자바 | Java 8에서 지원됩니다.상세한 것에 대하여는, 다음의 「Java 제한」섹션을 참조해 주세요. | |
자바스크립트 | [26] | |
줄리아. | [27] | |
코틀린 | [28] | |
리스프 | ||
로그토크 | ||
루아 | [29] | |
유행성 이하선염 | ||
메이플 | [30] | |
매트랩 | [31] | |
막시마 | [32] | |
님 | [33] | |
OCaml | [34] | |
옥타브 | [35] | |
오브젝트 파스칼 | 오브젝트 파스칼의 방언인 델파이는 델파이의 2009년 이후 기본적으로 익명 함수(공식적으로 익명 메서드)를 지원합니다.옥시진 오브젝트 파스칼 방언도 이들을 지원합니다. | |
Objective-C(Mac OS X 10.6+) | Called blocks. Objective-C 외에 Apple 플랫폼에서 프로그래밍할 때 C 및 C++에서도 블록을 사용할 수 있습니다. | |
OpenSCAD | Function Literal 지원은 2021.[36]01 버전에서 도입되었습니다. | |
파스칼 | ||
펄 | [37] | |
PHP | PHP 5.3.0에서는 진정한 익명 함수가 지원됩니다.[38]이전에는 부분적인 익명 함수만 지원되었으며, 이는 C#의 구현과 매우 유사했습니다. | |
PL/I | ||
파이썬 | Python은 문이 아닌 식만 지원하는 lambda [39]구문을 통해 익명 함수를 지원합니다. | |
R | ||
라켓 | [40] | |
라쿠 | [41] | |
렉시 | ||
RPG | ||
루비 | Smalltalk에서 물려받은 Ruby의 익명 기능은 블록이라고 [42]불립니다. | |
녹 | [43] | |
스칼라 | [44] | |
스킴 | ||
스몰토크 | Smalltalk의 익명 기능은 블록이라고 불립니다. | |
표준 ML | [45] | |
재빠르다 |