Gidhub BE Developer

Lambda, Iteration, Generators

2018-01-30
goodGid

람다 함수

  • 람다 함수는 사실 이름이 없이 객체만 있을 뿐이다.

  • C / C++에서 함수는 반드시 이름이 있어야 한다. 그러나 Python에서는 이름이 없고 함수 객체만 존재하는 익명 함수를 만들 수 있다.

lambda 인자 : <구문>
>>> 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문이 동작하는 원리는 다음과 같다
  1. for문에서 지정한 순회 가능한 객체에서 이터레이터 객체를 가져온다.

  2. 이때 이터레이터는 객체의 첫 번째 요소를 가리킨다.

  3. 그런 다음 이터레이터 안의 __next__() 메서드를 실행한다.

  4. __next__()는 현재 이터레이터가 가리키는 객체의 요소를 반환하고,
    객체의 다음 요소로 이터레이터를 옮긴다.

  5. 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() 함수가 호출되면 가장 최근호출된 상태로 실행된다.


Comments

Content