기본 콘텐츠로 건너뛰기

[matplotlib] 등고선(Contour)

코틀린 람다함수와 고차함수

Lambda 함수 

함수의 이름이 없는 익명함수(anonymous function)이라고 합니다.

{매개변수 → 실행 코드(몸체)}

위 함수의 구조와 같이 람다(익명)함수는 중괄호 내에 실행문을 입력합니다.
다음은 간단한 예로 문자열을 출력하는 함수입니다.
이 함수를 실행하기 위해서는 함수다음에 인수를 전달하기 위한 ()를 같이 나타내야 합니다.
다음은 전달하는 인수가 별도로 존재하지 않는 경우입니다.

{println("Hello")}()
      Hello

람다함수 역시 개체이므로 변수에 저장할 수 있습니다.
이 경우 변수명은 함수이름과 같은 역할을 합니다.
그러므로 객체를 호출할 경우 함수와 같이 적용해야 합니다. 즉, 변수명()

val swim={println("swim \n")}
swim()
      swim

다음은 매개변수가 존재하는 경우입니다.

var dirty = 20
val waterFilter = {dirty: Int -> dirty/2}
waterFilter(dirty)
      10

위 람다는 함수를 간단하게 표현하는 방법으로 나타낼 수 있습니다.

fun waterFilter(dirty:Int) = dirty+10
waterFilter(dirty)
      30

람다 함수는 실제로 고차함수(함수를 인수로 취하는 모든 함수)를 사용할 때 강력합니다.

fun updateDirty(dirty: Int, operation: (Int)->Int):Int{
    return operation(dirty)
}

updateDirty(dirty){dirty -> dirty+50}
      70

고차 함수(Higher-Order Functions)

일반적으로 함수는 매개변수와 반환값이 데이터인데 반해 
고차 함수(고계도 함수)는 전달받는 매개변수나 반환물이 함수인 경우입니다. 
즉, 다음 중 하나를 만족하는 함수를 의미합니다.

1) 함수를 매개변수(파라미터)로 전달 받는 함수
2) 함수를 리턴(반환)하는 함수

다음은 함수에 인수로 문자열을 받아 그 문자열의 길이를 반환하는 함수로서
매개변수를 람다함수를 받는 경우입니다.
이 함수는 람다함수를 매개변수로 받기 때문에
그 함수의 적용은 길이를 반환하는데에 고정되지 않습니다.

fun stringMapper(str:String, result:(String)->Int):Int{
    return result(str)
}

println(stringMapper("Android", {input-> input.length}))
      7

println(stringMapper("Android", {input-> input.length*input.length}))
      49

다음은 정수와 람다함수를 매개변수로 받아 인수인 정수에 다른 함수를 적용하는 것입니다.

fun numFun(x1: Int, argFun: (Int) -> Int){
    val result = argFun(x1)
    println("x1 : x1,someFun1:result")
    }

numFun(7,{x -> x*x*x})
      x1 : 7, someFun1 : 343

numFun(7, {x -> (x*x)/10})
      x1 : 7, someFun1 : 4


함수내에 함수를 매개변수로 받은 것입니다.
즉, 함수내에 내포된 함수를 하나더 생성한 것입니다.
이 경우 내포한 함수 역시 매개변수가 필요합니다.
위의 두 경우 내포된 함수에 전달한 다른 매개변수를  사용합니다.
매개변수로 사용된 람다함수의 결과를 다르게 할 수 있으므로
하나의 함수에서 다양한 결과를 생성하게 할 수 있습니다.

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. (1)A=PBP1P1AP=B 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. (식 2)BλI=P1APλP1P=P1(APλP)=P1(AλI)P 식 2의 행렬식은 식 3과 같이 정리됩니다. det(BλI)=det(P1(APλP))=det(P1)det((AλI))det(P)=det(P1)det(P)det((AλI))=det(AλI)det(P1)det(P)=det(P1P)=det(I) 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같...

[sympy] Sympy객체의 표현을 위한 함수들

Sympy객체의 표현을 위한 함수들 General simplify(x): 식 x(sympy 객체)를 간단히 정리 합니다. import numpy as np from sympy import * x=symbols("x") a=sin(x)**2+cos(x)**2 a sin2(x)+cos2(x) simplify(a) 1 simplify(b) x3+x2x1x2+2x+1 simplify(b) x - 1 c=gamma(x)/gamma(x-2) c Γ(x)Γ(x2) simplify(c) (x2)(x1) 위의 예들 중 객체 c의 감마함수(gamma(x))는 확률분포 등 여러 부분에서 사용되는 표현식으로 다음과 같이 정의 됩니다. 감마함수는 음이 아닌 정수를 제외한 모든 수에서 정의됩니다. 식 1과 같이 자연수에서 감마함수는 factorial(!), 부동소수(양의 실수)인 경우 적분을 적용하여 계산합니다. (식 1)Γ(n)={(n1)!n:자연수0xn1exdxn:부동소수 x=symbols('x') gamma(x).subs(x,4) 6 factorial 계산은 math.factorial() 함수를 사용할 수 있습니다. import math math.factorial(3) 6 a=gamma(x).subs(x,4.5) a.evalf(3) 11.6 simpilfy() 함수의 알고리즘은 식에서 공통사항을 찾아 정리하...

sympy.solvers로 방정식해 구하기

sympy.solvers로 방정식해 구하기 대수 방정식을 해를 계산하기 위해 다음 함수를 사용합니다. sympy.solvers.solve(f, *symbols, **flags) f=0, 즉 동차방정식에 대해 지정한 변수의 해를 계산 f : 식 또는 함수 symbols: 식의 해를 계산하기 위한 변수, 변수가 하나인 경우는 생략가능(자동으로 인식) flags: 계산 또는 결과의 방식을 지정하기 위한 인수들 dict=True: {x:3, y:1}같이 사전형식, 기본값 = False set=True :{(x,3),(y,1)}같이 집합형식, 기본값 = False ratioal=True : 실수를 유리수로 반환, 기본값 = False positive=True: 해들 중에 양수만을 반환, 기본값 = False 예 x2=1의 해를 결정합니다. solve() 함수에 적용하기 위해서는 다음과 같이 식의 한쪽이 0이 되는 형태인 동차식으로 구성되어야 합니다. x21=0 import numpy as np from sympy import * x = symbols('x') solve(x**2-1, x) [-1, 1] 위 식은 계산 과정은 다음과 같습니다. x21=0(x+1)(x1)=0x=1or1x4=1의 해를 결정합니다. solve() 함수의 인수 set=True를 지정하였으므로 결과는 집합(set)형으로 반환됩니다. eq=x**4-1 solve(eq, set=True) ([x], {(-1,), (-I,), (1,), (I,)}) 위의 경우 I는 복소수입니다.즉 위 결과의 과정은 다음과 같습니다. x41=(x2+1)(x+1)(x1)=0x=±1,±1=±i,±1 실수...