함수
관련내용
- 함수(Function): 함수의 정의
- 전역변수와 지역변수
- 함수: 인수의 전달
- 가변인수
- 발생자(generator)
- 재귀함수(Recursive Function)
- Python의 함수는 1급(First Class)객체
- 1급 객체와 변수의 영역
- 클로저(Closure)
- 람다함수(Lambda Function)
- 주요한 내장함수들
- 데코레이터(Decorator, 장식자)
발생자(generator)
- 함수(Function): 함수의 정의
- 전역변수와 지역변수
- 함수: 인수의 전달
- 가변인수
- 발생자(generator)
- 재귀함수(Recursive Function)
- Python의 함수는 1급(First Class)객체
- 1급 객체와 변수의 영역
- 클로저(Closure)
- 람다함수(Lambda Function)
- 주요한 내장함수들
- 데코레이터(Decorator, 장식자)
발생자(generator)
발생자(generator)는 이터레이터(iterator)를 생성하는 함수로서 return()
함수 대신 yield 구문
을 사용하여 결과를 반환합니다. 발생자의 기본 구조는 식 1와 같습니다.
def 함수이름(인수): 본 문 yield 결과 | (식 1) |
다음 함수는 가변인자를 전달하여 리스트 객체를 반환합니다.
def mkList(*x): re=[] for i in x: re.append(i*i) return re b=mkList(1,2,3);b
[1, 4, 9]
위 함수에 의해 생성된 객체는 리스트로서 요소를 하나씩 호출할 수 있는 이터러블(iterable)이지만 게으른 평가에 의해 이루어지는 이터레이터는 아닙니다. 즉, 내장 메소드 __next__() 또는 내장 함수 next()
에 의해 실행되지 않습니다.
내장 메소드 또는 속성은 이름 앞뒤로 이중 밑줄(under score)를 함유하고 있으며 파이썬에서 객체를 생성할 경우 자동적으로 부여되는 메소드입니다.
- next(x)
- 이터레이터 객체인 x의 성분을 하나씩 호출
- 모든 성분이 호출된 후 next()의 실행은 예외StopIteration이 발생
- iter(x)
- x: 내장 메소드인 __iter__()를 포함한 클래스 객체, 즉, 이터러블(iterable) 객체
- x를 이터레이터(iterator)로 전환
next(b)
TypeError: 'list' object is not an iterator
위 객체 b를 iterator로 만들기 위해 내장함수 iter()
를 실행합니다.
b1=iter(b) b1
<list_iterator at 0x2066b72dbd0>
b1=iter(b) for i in range(len(b)): print(next(b1))
1 4 9
객체 b1은 함수에 의해 생성된 객체를 이터레이터로 전환한 것입니다. 이와 유사하게 함수 자체를 이터레이터로 만들기 위해서는 일반적인 함수를 발생자로 작성해야 합니다. 발생자에 의해 생성된 객체는 내장메소드 __iter__()와 __next__()
을 포함해야 합니다. 다음 함수와 같이 결과의 반환을 위해 yield 문을 적용하는 것으로 이 두 매소드들이 부여됩니다.
def mkList1(*x): for i in x: yield i
a=mkList1(1,2,3) a
<generator object mkList1 at 0x7f3299a680b0>
type(a)
generator
[i in dir(a) for i in ["__iter__", "__next__"]]
[True, True]
객체 a는 이터레이터이므로 내장함수 next()
를 실행할 수 있습니다.
next(a)
1
next(a)
2
next(a)
3
yield 문을 사용하는 발생자를 대신하여 내장 메소드 __iter__()
또는 내장 함수 iter()
를 사용하여 결과를 return()
에 전달하는 것으로 이터레이터를 만들 수 있습니다. 그러나 이렇게 수정된 함수에 의해 생성된 객체는 발생자가 아닌 이터레이터입니다.
발생자와 이터레이터는 상당히 유사하지만 각기 다른 클래스에 포함되며 이터레이터 클래스로 좀더 복잡한 동작을 구현할 수 있습니다.
def mkList3(*x): re=[] for i in x: re.append(i*i) return iter(re)
c=mkList3(1,2,3) "__next__" in dir(c)
True
c
<list_iterator at 0x2066b729420>
type(c)
list_iterator
for i in range(3): print(next(c))
1 4 9
댓글
댓글 쓰기