관리 메뉴

태섭씨 블로그

파이썬 람다 - 색다른 람다 튜토리얼 (1) 본문

IT/Python

파이썬 람다 - 색다른 람다 튜토리얼 (1)

태섭씨 2016. 2. 11. 11:39

자바 8의 람다를 공부하다가, 

기존에 내가 알고 있던 파이썬의 람다를 복습하기 위해 이것저것 찾아보던 중 

괜찮은 내용이 있어 필요한 내용만 정리한다. (번역이 정확하지는  않고 의역이 있으니 참고해야함. 내용을 중간중간 빼먹기도 했다.;)


원문 - https://pythonconquerstheuniverse.wordpress.com/2011/08/29/lambda_tutorial/




------------------------------------------------------------------------------------------------


색다른 람다 튜토리얼

(Yet Another Lambda Tutorial)



람다 : 함수를 만들기 위한 툴 
기본적으로, 파이썬의 람다는 함수를 만들기 위한 툴이다. (정확히는 함수 오브젝트) 즉 파이썬은 함수를 만드는 툴이 2가지가 있다 : def 를 이용한 방법과 람다lambda 를 이용한 방법

예를 들어보자. def를 이용한 일반적인 방법으로 함수를 만드는 것은 다음과 같다 : 
1
def square_root(x): return math.sqrt(x)


람다를 이용하면 다음과 같다 : 
1
square_root = lambda x: math.sqrt(x)



람다를 사용하면 뭐가 좋은가? 

람다를 사용하면 뭐가 좋은가? 왜 람다를 사용해야 하나?
대답은 이렇다 : 
 - 람다를 사용할 필요는 없다. 람다 없이도 문제없이 개발할 수 있다.
 - 하지만 특정 상황에서는 편리하다 - 람다는 코드 작성을 조금 더 쉽게 해주고, 조금 더 명확하게 해준다. 

어떤 종류의 상황인가 ?
딱 한번만 쓰이는 함수가 필요한 상황이다.

일반적으로 함수는 2가지 목적을 가지고 만들어진다 : (a) 코드 중복을 줄이기 위해 (b) 코드를 모듈화 하기 위해.

만약 당신이 만드는 함수가 딱 한 번만 - 어플리케이션의 한 장소에서만 - 호출될 예정이라고 가정해보자.
그러면 함수에 이름을 붙일 필요가 없어진다. 즉 함수는 "익명"이 될 수 있다. 또한 함수를 사용하기 원하는 장소에 바로 정의할 수 있다. 이 경우 람다는 유용해진다. 

하지만
 - 왜 함수를 딱 한번만 호출하려고 하지? 이것은 함수를 만드는 이유 (a)와 상쇄된다.
- 그리고 람다 함수의 본문은 한 개의 표현식(expression)만 가질 수 있다. 이 말은 람다 함수는 짧아져야만 한다는 것을 의미한다. 이것은 함수를 만드는 이유 (b)를 상쇄한다.


짧고 이름없는 함수를 만들기 위해 가능한 이유는 무엇인가 ? 

아래의  Tkinter GUI 인터페이스에서 버튼의 동작을 정의하기 위해 람다를 사용하는 짧은 코드를 보자.

1
2
3
4
5
6
7
8
9
10
frame = tk.Frame(parent)
frame.pack()
 
btn22 = tk.Button(frame,
        text="22", command=lambda: self.printNum(22))
btn22.pack(side=tk.LEFT)
 
btn44 = tk.Button(frame,
        text="44", command=lambda: self.printNum(44))
btn44.pack(side=tk.LEFT)


여기서 기억해야 할 것은 tk.Button 은 command 파라미터의 아규먼트로 함수 오브젝트를 기대한다는 것이다. 이 함수 오브젝트는 버튼이 클릭될 때에 버튼이 호출하는 함수가 될 것이다. 기본적으로 이 함수는 버튼이 클릭될 때에 GUI 가 하는 동작을 정의할 것이다. 

그러므로 command 파라미터를 통해서 button 에게 함수 오브젝트를 전달해야만 한다. 그리고 (각각의 다른 버튼들은 각각 다른 일을 하기 때문에) 각각의 버튼 오브젝트들에게는 각각 다른 함수 오브젝트가 필요하다는 것을 기억해야만 한다. 각각의 함수는 각각의 버튼에 의해 한번만 사용될 것이다. 

그러므로 다음과 같이 코드를 짤 수 있지만

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def __init__(self, parent):
    """Constructor"""
    frame = tk.Frame(parent)
    frame.pack()
 
    btn22 = tk.Button(frame,
        text="22", command=self.buttonCmd22)
    btn22.pack(side=tk.LEFT)
 
    btn44 = tk.Button(frame,
        text="44", command=self.buttonCmd44)
    btn44.pack(side=tk.LEFT)
 
def buttonCmd22(self):
    self.printNum(22)
 
def buttonCmd44(self):
    self.printNum(44)


다음과 같이 짜는 것이 더 쉽고 명확하다

1
2
3
4
5
6
7
8
9
10
11
12
def __init__(self, parent):
    """Constructor"""
    frame = tk.Frame(parent)
    frame.pack()
 
    btn22 = tk.Button(frame,
        text="22", command=lambda: self.printNum(22))
    btn22.pack(side=tk.LEFT)
 
    btn44 = tk.Button(frame,
        text="44", command=lambda: self.printNum(44))
    btn44.pack(side=tk.LEFT)


GUI 프로그램이 이러한 종류의 코드를 가지면,  버튼 오브젝트는 command 파라미터로 제공받은 함수 오브젝트를 호출(callback) 한다고 한다.

그러므로 코딩 시 람다가 가장 빈번하게 사용되는 곳은 Tkinter 나 wxPython 과 같은 GUI 프레임워크의 콜백함수라고 할 수 있다.


------------------------------------------------------------------------------------------------


나머지 내용은 다음 포스팅으로 ... ;; 




'IT > Python' 카테고리의 다른 글

파이썬 소스의 컴파일  (0) 2015.03.22
Comments