람다 함수
-
람다 함수는 사실 이름이 없이
객체만
있을 뿐이다. -
C / C++에서 함수는 반드시 이름이 있어야 한다.
그러나 Python에서는 이름이 없고 함수 객체만 존재하는
익명 함수
를 만들 수 있다.
사용법
lambda 인자 : <구문>
Example
>>> g = lambda x,y : x * y
>>> g(2,3)
6
>>> (lambda x: x * x)(3)
9
이터레이터(Iteration)
- 이터레이터는 순회 가능한 객체의 요소에 순서대로 접근할 수 있는
객체
이다.
>>> for element in [1,2,3]: # 리스트를 순회한다.
... print(element)
>>> for element in (1,2,3): # 튜플를 순회한다.
... print(element)
>>> for element in {'one':1, 'two':2 }: # 사전를 순회한다.
... print(element)
>>> for element in "123": # 문자열의 한 문자씩 순회한다.
... print(element)
>>> for element in open("myfile.txt"): # 파일의 내용을 순회한다.
... print(element)
- for문이 동작하는 원리는 다음과 같다
-
for문에서 지정한
순회 가능한 객체
에서이터레이터 객체
를 가져온다. -
이때 이터레이터는 객체의 첫 번째 요소를 가리킨다.
-
그런 다음 이터레이터 안의
__next__()
메서드를 실행한다. -
__next__()
는 현재 이터레이터가 가리키는 객체의 요소를 반환하고
객체의 다음 요소로 이터레이터를 옮긴다. -
for 구문은
StopIteration
예외를 만날 때까지 반복적으로__next__()
를 수행한다.
>>> s = 'abc'
>>> it = iter(s)
>>> it
<str_iterator object at 0x103876390>
>>> next(it)
'a'
>>> it
<str_iterator object at 0x103876390>
>>> next(it)
'b'
>>> it.__next__()
'c'
>>> next(it)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
제너레이터(Generators)
-
제너레이터(Generators)
는이터레이터(Iterator)
를 만드는 간단하고 강력한 도구이다. -
함수와 비슷하게 생겼지만 값을 넘겨주는 부분에서 return대신
yield
를 사용한다. -
제너레이터를 이해하려면 우선 함수의 동작 원리를 알아야 한다.
-
함수가 호출되면
지역 변수
와코드
가스택
에 적재되고 코드를실행
한다.
그리고 함수가 끝나면 결과값을 호출한 곳에 넘겨주고함수 객체
는 스택에서 사라진다. -
하지만 제너레이터에서는
yield
라고 적은 곳에서 잠시 멈추고 호출한 곳에 값을 전달 한다. -
이를 호출한 곳에서
next()
함수를 실행하면 제너레이터는중단된 위치
로 부터다시 시작
한다. -
이 때 제너레이터는 모든 데이터와 마지막 시행된 명령문을 유지하고 있다.
>>> def reverse(data):
... for idx in range(len(data) -1, -1, -1):
... yield data[idx]
>>> for char in reverse('golf'):
... print(char)
f
l
o
g
-
reverse() 함수는 반복문에 의해 4번 호출된다.
-
yield
는 호출 한 곳에 값을 돌려주지만함수
는메모리
에 그대로 있다. -
그래서 다음 번에 reverse() 함수가 호출되면
가장 최근
에호출된 상태
로 실행된다.