5. 클로져, 람다, 제너레이터, 예외처리
2016. 10. 17. 23:15ㆍProgramming 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에 대한 개념이 있어야 하므로 뒤에서 다시 다룬다.
'Programming Languages > PYTHON' 카테고리의 다른 글
7. 객체(1)-객체 생성하기, 상속 (0) | 2016.10.25 |
---|---|
6. 모듈, 패키지, 프로그램 (0) | 2016.10.23 |
4. 함축(컴프리헨션), 함수 (3) | 2016.10.14 |
3. 루프, 순회(이터레이션) (0) | 2016.10.14 |
2. 리스트, 튜플, 딕셔너리, 셋 (0) | 2016.10.13 |