Coding 공부/Big data & Python

[Big data&Python] iterator, generator, generator expression, closure, decorator, jupyter notebook

CBJH 2024. 3. 9.
728x90
반응형

1. iterator

 

  • iterator는 next()를 사용 하여 다음 요소를 가져올 수 있는 객체를 의미한다.
  • iterator를 사용할 수 있는 데이터 구조는 list, tuple, dictionary, set 등이 있다.
  • for문으로 값을 읽어 올 수 있으면 iterable(반복 가능한) 하다고 할 수 있다.
  • next 함수로 다음 요소를 가져 올 수 없으면 iterator가 아니다.
  • liter, tuple, dictinary, set을 iter()로 형변환하여 사용한다. 
  • 인덱스를 사용해서 받아오는 것이 아니라 요소를 불러오고 다음 요소에 접근하는 방식이다.

 

  1.1 iterator 예제

 

  • iter()로 형변환 한 it을 출력 하면 list_iterator object가 출력됩니다.
  • next()로 값을 하나씩 가져올 수 있습니다.
  • 다음 요소가 없는데도 next()를 호출하면 StopIteration 에러가 발생합니다.

 

  1.2 iterator의 특징

 

  • next() 함수를 사용하여 다음 요소를 가져올 수 있습니다.
  • 다음 요소가 없는데도 next()를 호출하면 StopIteration 에러가 발생합니다.
  • iterator는 모든 값을 한 번에 반환하지 않고 필요할 때마다 하나씩 반환합니다. 이를 lazy evaluation이라고 합니다.
  • iterator는 모든 값을 메모리에 저장하지 않고 필요할 때마다 값을 생성합니다.
  • iterator는 한 번 사용하면 다시 사용 할 수 없습니다.
  • iterator는 for문에서 사용할 수 있습니다.

 

 1.3 매직 메소드(magic method) 또는 스페셜 메소드(special method)

매직 메소드는 클래스 내부에서 사용되며 __로 시작하고 __로 끝납니다.

__iter__

  • 객체가 "반복 가능(iterable)"임을 나타냅니다.
  • 반복을 위한 iterator 객체를 반환해야 합니다.(자기 자신을 반환 한다. return self)
  • 이 메서드가 반환하는 객체는 __next__ 메서드를 구현해야 하며, 이는 보통 iterator 객체 자신입니다.

__next__

  • iterator 객체의 핵심 부분으로, 반복에서 다음 요소를 반환합니다.
  • 이 메서드가 호출될 때마다, iterator는 컬렉션의 다음 요소를 반환해야 합니다.
  • 더 이상 반환할 요소가 없을 때 StopIteration 예외를 발생시켜야 합니다.
  • for 루프와 같은 반복 구조는 StopIteration 예외를 만나면 반복을 종료합니다.

 

  1.3 iterator 연습문제

 

 

2. generator

 

  • generator는 한 마디로 iterator를 생성해 주는 함수입니다. iterator와 동일하게 next() 함수를 사용하여 데이터를 순차적으로 호출 할 수 있습니다. generator를 알기 위해 먼저 yield 키워드에 대해 살펴보겠습니다.

 

  2.1 yield 키워드

  • yield는 함수에서 값을 반환(return)하고, 함수의 실행을 그 지점에서 일시적으로 중지합니다. 다음 번에 함수가 호출되면, yield 다음의 명령문부터 실행이 재개됩니다. 예시를 통해 이해해 보겠습니다.
  • return과 역할은 비슷하지만 다른 기능을 가진 키워드이다.

  2.2 yield 예제

  • yield가 들어간 함수는 type이 fuction이고 호출한 변수의 type은 generator이다.
  • 처음 next(t)를 호출하면 print('A')가 실행되고 yield 1에서 일시적으로 중지됩니다.
  • 다음 번 next(t)를 호출하면 yield 1 다음의 명령문인 print('B')가 실행되고 yield 2에서 일시적으로 중지됩니다.
  • 마지막으로 next(t)를 호출하면 yield 2 다음의 명령문인 print('C')가 실행되고 yield 3에서 일시적으로 중지됩니다.
  • 이후 next(t)를 호출하면 StopIteration 예외가 발생합니다.
  • generator는 yield를 사용한 함수를 호출하여 반환된 객체입니다.

 

2.3 generator의 특징

  • 모든 데이터를 메모리에 미리 로드하지 않습니다. 필요할 때마다 데이터를 하나씩 '생성(yield)'합니다. 이로 인해 큰 데이터셋을 처리할 때 메모리를 절약할 수 있습니다.
  • Lazy Evaluation(지연 실행): 값이 필요할 때까지 계산을 미룹니다. 즉, next() 함수가 호출될 때 다음 값을 생성합니다.
  • 실행 중인 상태를 유지합니다. 함수의 로컬 변수와 실행 상태는 yield가 발생할 때마다 보존되고, 다음 값이 요청될 때까지 해당 상태가 유지됩니다.
  • 더 이상 반환할 값이 없을 때 자동으로 StopIteration 예외를 발생시킵니다. 이는 반복이 끝났음을 나타냅니다.
  • 간결한 코드: 복잡한 iterator를 만드는 대신, 간단하게 yield 키워드를 사용하여 값들을 생성할 수 있어 코드가 더 간결해집니다.

 

2.4 generator 예제

 

 

2.5 generator expression

generator expression은 list, set, dictionary comprehension과 유사하게 사용할 수 있습니다. generator 표현식은 ()를 사용합니다. generator 표현식은 list, set, dictionary comprehension과 다르게 한 번에 모든 값을 메모리에 저장하지 않고 필요할 때마다 값을 생성합니다.

 

2.6 generator expression 예제

 

2.7 iterator와 generator의 차이점은?

  • iterator는 __next__() 메서드를 구현해야 합니다.
  • generator는 yield 키워드를 사용한 함수를 구현해야 합니다.
  • iterator는 사용자 정의 클래스로 복잡한 반복 동작을 구현할 수 있습니다.
  • generator는 간결한 코드로 간단한 데이터 시퀀스를 생성하는 데 사용됩니다.

 

2.8 generator, generator exprehenssion 연습문제

 

 

 

3. closure

  • 파이썬은 함수형 프로그래밍이 되기 때문에 함수를 리턴값으로 받을 수 있다. type은 function이다.
  • outer_function은 내부에서 inner_function을 정의하고 반환합니다.
  • inner_function은 outer_function의 지역 변수 message를 참조합니다.
  • outer_function()을 호출하면 inner_function을 반환합니다. my_closure에는 inner_function이 매핑됩니다.
  • my_closure를 호출하면 inner_function이 실행됩니다. 이 때 inner_function은 outter_function의 지역 변수인 message 변수의 값을 기억하고 있습니다. print(message)를 통해 message 변수의 값을 출력합니다.

  • 첫번째 예시와 다른 점은 outer_function의 파라미터로 message를 전달 받습니다.
  • outer_function('Hi')를 호출 할 때 전달된 인수 값 'Hi'를 inner_function이 기억하고 있다가 호출 될 때 출력됩니다.

  3.1 nonlocal 키워드

  • inner_function에서 message 변수의 값을 변경하여 다시 저장하고 싶은 경우 nonlocal 키워드를 사용합니다.
  • nonlocal 키워드를 사용하지 않으면 message 변수는 inner_function의 지역 변수로 사용 되기 때문에 UnboundLocalError: local variable 'message' referenced before assignment 에러가 발생합니다.

 

 

  3.2 closure의 특징

  • 외부 함수가 종료된 후에도 외부 함수의 지역 변수의 상태를 유지하여 해당 변수들에 대한 접근과 조작이 가능합니다.(message 변수의 값을 기억하고 있다가 호출 될 때 출력)
  • 외부에서 직접 접근할 수 없는 변수를 포함하여 데이터를 은닉하고 캡슐화합니다.(message 변수에 직접 접근 할 수 없습니다.)
  • 필요한 데이터만을 유지하므로, 메모리 사용에 있어서 효율적입니다. 큰 데이터 구조를 전역으로 유지할 필요가 없습니다.(message 변수만 유지하므로 메모리 사용에 효율적입니다.)
  • 실행 시점에 동적으로 동작을 생성할 수 있습니다. 동일한 외부 함수에 대해 다양한 동작을 하는 여러 클로저를 생성할 수 있습니다.(outer_function을 호출 할 때 파라미터를 다르게 전달하여 호출)

3.3 closure 연습문제

3.4 class를 이용한 동일 기능 구현

 

  • class의 생성자(__init__)에서 message를 인스턴스 변수로 저장합니다.
  • __call__ 메서드를 정의하여 인스턴스를 함수처럼 호출 할 수 있도록 합니다.
  • hi_closure()와 hello_closure()를 호출하면 __call__ 메서드가 실행되어 message 변수의 값을 출력합니다.

위와 같이 class를 이용하여 기능을 구현 할 수 있습니다. 하지만 closure를 이용하면 더 간단하게 구현 할 수 있습니다.

__call__

  • 매직 메서드(magic method)라고도 합니다.
  • __call__ 메서드를 정의하면 인스턴스를 함수처럼 호출 할 수 있습니다.
  • 위의 예시에서 OuterClass의 인스턴스인 hi_closure와 hello_closure를 함수처럼 호출 하였습니다.

 

 

4. decorator

 

display 함수를 파라미터로 decorator_function을 실행하고 그 결과값(decorated_display)을 다시 함수처럼 호출 하였더니 앞서 파라미터로 전달한 display 함수가 실행되었습니다. 뭔가 복잡합니다. 하나씩 살펴보겠습니다.

  • decorator_function
    • 내부에서 wrapper_function을 정의하고 반환합니다.
    • wrapper_function은 decorator_function의 파라미터로 전달된 original_function을 호출합니다.
  • 문자열을 출력하는 display 함수를 정의합니다.
  • 이제 decorator_function을 호출합니다.
    • display 함수가 decorator_function의 파라미터(original_function)로 전달됩니다.
    • 반환된 값은 original_function을 실행 하는 wrapper_function입니다.
  • 반환된 wrapper_function을 호출합니다.
    • wrapper_function은 decorator_function의 파라미터로 전달된 original_function를 기억하고 있다가 호출하게 됩니다.(closure)
    • display 함수가 실행됩니다.

 

 

4.1 decorator 예제

첫번째 예시와 차이점은 wrapper_function 함수에 파라미터가 추가 되었습니다. original_function를 호출 할 때 파라미터를 전달하기 위해서 입니다.

  • 파라미터가 없는 display 함수를 인수로 전달하여 호출합니다.
    • 반환된 decorated_display를 호출하면 'display 함수가 실행됐습니다.'라는 문자열이 출력됩니다.
  • 2개의 파라미터(name, age)를 받는 display_info 함수를 인수로 전달하여 호출합니다.
    • wrapper_function은 파라미터(name, age)가 포함 된 채로 original_function을 기억합니다.
    • 반환된 decorated_display를 호출하면 warpper_function가 실행 되고 파라미터(name, age)가 포함 된 채로 original_function이 실행됩니다.
    • 'display_info(John, 25) 함수가 실행됐습니다.'라는 문자열이 출력됩니다.

 

4.2 decorator @decorator_function 예제

decorator_function를 호출 할 때 display를 인수로 전달-> @decorator_function 다음에 displya 함수를 정의
decorator_function의 반환값을 decorated_display에 할당하고 decorated_display를 호출-> 그저 display 함수를 호출

 

 

4.3 flask에서 decorator를 사용하는 예시

  • 프롬프트창에서 pip install flask를 입력해 설치 후 import한다.
  • 파이썬 파일을 run하면 flask서버가 실행된다.
  • 아래의 URL로 접속합니다.
  • http://localhost:5050/
  • Hello Flask!라는 문자열이 출력됩니다.

 

 

5.  Jupyter notebook

 

  5.1 소개

 

Jupyter Notebook은 데이터 분석 및 프로그래밍 작업을 수행하는 데 도움을 주는 인터랙티브한 개발 도구입니다. 주피터 노트북을 사용하면 코드, 그래프, 텍스트 등을 하나의 문서에 통합하여 작성하고 공유할 수 있습니다. 이 문서에서는 Jupyter Notebook의 설치 및 기본 세팅 방법에 대해 알아보겠습니다.

  5.2 설치하기

 

Jupyter Notebook을 설치하기 위해서는 Python이 우선 설치되어 있어야 한다.

Python이 설치되었다면, 아래의 명령어를 통해 Jupyter Notebook을 설치할 수 있습니다:

명령 프롬프트에서 밑의 명령어 실행

pip install jupyter

 

5.3 Jupyter Notebook 실행하기

Jupyter Notebook을 실행하기 위해서는 터미널 또는 명령 프롬프트에서 다음 명령어를 입력하세요:

jupyter notebook

명령어를 실행하면 기본 웹 브라우저에서 Jupyter Notebook이 열립니다. 만약 기본 포트 8888이 이미 사용 중인 경우, 다른 포트 번호를 선택하도록 지시됩니다.

5.4 Jupyter Notebook 사용 방법

 

  1. 노트북 생성하기
    1. Jupyter Notebook을 실행한 후, 브라우저에서 "New" 버튼을 클릭하고 "Python 3"을 선택하여 새로운 노트북을 생성할 수 있습니다.
  2.  셀 사용하기
    1. 노트북은 셀(Cell)이라는 단위로 구성되어 있습니다. 이는 코드, 텍스트, 그래프 등을 포함할 수 있는 공간입니다.
    2. Code 셀: 코드를 작성하고 실행할 수 있는 셀입니다. 코드 셀에 Python 코드를 입력하고 Shift + Enter 키를 눌러 코드를 실행할 수 있습니다.
    3. Markdown 셀: 텍스트, 제목, 목록 등을 작성할 수 있는 셀입니다. Markdown 셀에 Markdown 형식으로 텍스트를 입력할 수 있습니다.
    4. 루트 디렉터리 : jupyter notebook을 실행한 곳이 루프 디렉터리가 된다.
  3.  셀은 실행 순서에 따라 번호가 할당되며, 실행된 셀의 결과와 출력이 노트북에 표시됩니다.
  4.  코드 실행하기
    1. Code 셀에 Python 코드를 작성하고 Shift + Enter 키를 눌러 코드를 실행하면 해당 셀이 실행되고 결과가 출력됩니다. 코드 셀은 여러 번 실행할 수 있으며, 실행 결과는 셀 아래에 표시됩니다.
  5.  마크다운 사용하기
    1. Markdown 셀에서는 일반 텍스트 뿐만 아니라 제목, 목록, 링크, 그림 등 다양한 형식의 텍스트를 작성할 수 있습니다. Markdown 형식을 사용하여 문서를 작성하는 방법은 다양한 참고 자료를 통해 익힐 수 있습니다.
  6.  노트북 저장하기
    1. 노트북은 자동으로 주기적으로 저장되지만, 수동으로 저장하는 것도 가능합니다. 노트북을 저장하려면 툴바의 "Save" 버튼을 클릭하거나, 메뉴의 "File" > "Save and Checkpoint"를 선택하세요.
  7. 주피터 노트북 단축키 (빈도수 높은)

     
    (1) 셀 선택 모드 (Command Mode)
     
    파란색은 셀 선택 상태입니다. (선택상태)
    [ESC] 또는 [Ctrl] + [m]를 눌러 셀이 아래와 같이 파란색이 된 상태(셀 선택 모드)에서 해당 단축키 누름


    a : 위에 새로운 셀 추가b : 아래에 새로운 셀 추가
    c : 셀 복사하기v : 셀 붙여넣기x : 셀 잘라내기dd : 셀 삭제하기
    p : 셀 아래에 붙여넣기
     
    o : 실행결과 열기/닫기
    m : Markdown으로 변경
    y : Code로 변경
    Shift + m : 선택 셀과 아래 셀과 합치기
    Ctrl + s 또는 s  : 파일 저장
    Enter  : 선택 셀의 코드 입력 모드로 돌아가기
     
     

     
    (2) 코드 입력 모드 (Edit Mode)
     
    초록색은 코드 입력 가능 상태입니다. (입력상태)
    [Enter]를 눌러 셀이 아래와 같이 초록색이 된 상태(코드 입력 모드)에서 해당 단축키 누름


     
    Ctrl + Enter : 입력 셀 실행 Shift + Enter : 입력 셀 실행 후 아래 셀로 이동 (없으면 새로운 셀 추가)Alt + Enter : 입력영역 실행 후 아래 새로운 영역 추가
     
    Ctrl + a : 선택 셀의 코드 전체 선택
    Ctrl + z : 선택 셀 내 실행 취소
    Ctrl + y : 선택 셀 내 다시 실행
    Ctrl + / : 커서 위치 라인 주석처리
     
    Shitf + Ctrl + - : 커서 위치에서 셀 둘로 나누기
    출처: https://planharry.tistory.com/22 [planharry:티스토리]

 

5.5 장단점

 

장점

  1. 인터랙티브한 개발 환경 제공: Jupyter Notebook은 코드와 결과물을 한 곳에서 통합하여 보여주기 때문에, 데이터 분석 및 개발 작업을 보다 편리하게 수행할 수 있습니다.
  2. 텍스트와 코드의 조합: Markdown 셀을 사용하여 문서화된 코드와 설명을 함께 작성할 수 있어, 코드의 이해도와 공유성을 높일 수 있습니다.
  3. 다양한 확장 기능: Jupyter Notebook은 다양한 확장 기능을 제공하고 있으며, 사용자의 요구에 따라 기능을 추가하거나 커스터마이징할 수 있습니다.

단점

  1. 성능 문제: Jupyter Notebook은 대량의 데이터 처리에는 적합하지 않을 수 있습니다. 큰 데이터셋을 다룰 경우, 다른 개발 환경을 고려해야 합니다.
  2. 공개 시 주의사항: Jupyter Notebook은 코드와 결과를 함께 저장하므로, 코드를 공개할 때 비즈니스 로직이 노출될 수 있으므로 주의해야 합니다.

5.6 마무리

이상으로 Jupyter Notebook의 설치와 사용 방법에 대해 알아보았습니다. Jupyter Notebook은 데이터 분석 및 프로그래밍 작업을 편리하게 수행할 수 있는 강력한 도구입니다. 다양한 기능과 확장성을 활용하여 보다 효율적인 작업을 진행해보세요!

 

 

 

 

출처: https://recording-it.tistory.com/40 [나를 위한 꾸준한 기록:티스토리]

 

댓글