5. 클로져, 람다, 제너레이터, 예외처리

2016. 10. 17. 23:15Programming Languages/PYTHON


*클로져(Closure)*

정의는 '어떤 함수의 내부에 선언된 함수로 상위 함수가 호출될 때 동적으로 생성되며 상위 함수가 전달 받은 인자를 알고 있는 함수' 이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def outer(arg):
    def inner():
        return "I know outer's argument : "+arg
    return inner
 
a=outer("hello")
b=outer("bye")
 
a()
 
"I know outer's argument : hello"
 
b()
 
"I know outer's argument : bye"
cs




*익명함수 람다(lambda())*

람다는 하나의 라인으로 된 간단한 작은 함수들을 여러 개 정의할 때 유용하다. 자주쓰이는 함수라면 이름을 붙여 정의하는 것이 좋겠지만, 익명함수 람다를 사용하는 것이 더 편한경우도 있다. 

1
2
3
4
5
6
def say_hello_to(name, func):
    return func(name)
 
say_hello_to("Jack", lambda word: print("Hello,",word))
 
Hello, Jack
cs



*제너레이터*
앞서 for와 같은 이터레이터에서 range() 함수를 사용했었다. '순환 가능한 객체' 라고 표현했었는데, 사실은 이름이 있다. 
range()와 같은 제너레이터는 메모리에 저장할 필요 없이 방대한 시퀀스를 순회할 수 있게 하는데, for와 같은 이터레이터의 소스로 자주 사용된다.
사용자가 직접 제너레이터를 생성할 수도 있는데, 일반 함수와 모양은 유사하지만 return 대신 yield문으로 값을 반환한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def my_range(first=0, last=10, step=1):
    number=first
    while number<last:
        yield number
        number+=step
 
for number in my_range():
    print(number)
 
0
1
2
3
4
5
6
7
8
9    
cs



*예외처리*
파이썬에서는 에러가 났을 때를 대비해 예외 처리를 해둔다. 에러가 발생하면 예외로 지정해둔 특정 코드를 실행하는 것이다.
어떤 함수에서 예외가 발생했을 때  핸들러를 제공했다면 버블링을 통해 예외를 잡아내지만 아닌경우 오류가 발생한 위치에 대한 정보와 에러를 띄우고 프로그램을 종료한다. 
1
2
3
4
5
6
7
test=[1,2,3,4]
position=6
try:
    test[position]
except:
    print("'position' should be in between 0 and",len(test)-1'but you entered', position)
 
cs



모든 에러타입을 하나의 예외로 처리하기 위해서는 위와 같이 단순한 try-except 구문을 사용하면 된다.

여러개의 에러를 구분해서 처리하고 싶다면 다음과 같이 특정 에러 타입이 떴을 때 실행해야할 코드를 각각 적어주면 된다.


except  예외타입 as 예외의 이름:


예외타입의 경우 파이썬에 기본으로 정의되어 있는 IndexError, Exception 뿐만 아니라 사용자가 지정한 것들도 사용할 수 있다.

예외를 새로 생성하는 것은 class에 대한 개념이 있어야 하므로 뒤에서 다시 다룬다.