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 사용 방법
- 노트북 생성하기
- Jupyter Notebook을 실행한 후, 브라우저에서 "New" 버튼을 클릭하고 "Python 3"을 선택하여 새로운 노트북을 생성할 수 있습니다.
- 셀 사용하기
- 노트북은 셀(Cell)이라는 단위로 구성되어 있습니다. 이는 코드, 텍스트, 그래프 등을 포함할 수 있는 공간입니다.
- Code 셀: 코드를 작성하고 실행할 수 있는 셀입니다. 코드 셀에 Python 코드를 입력하고 Shift + Enter 키를 눌러 코드를 실행할 수 있습니다.
- Markdown 셀: 텍스트, 제목, 목록 등을 작성할 수 있는 셀입니다. Markdown 셀에 Markdown 형식으로 텍스트를 입력할 수 있습니다.
- 루트 디렉터리 : jupyter notebook을 실행한 곳이 루프 디렉터리가 된다.
- 셀은 실행 순서에 따라 번호가 할당되며, 실행된 셀의 결과와 출력이 노트북에 표시됩니다.
- 코드 실행하기
- Code 셀에 Python 코드를 작성하고 Shift + Enter 키를 눌러 코드를 실행하면 해당 셀이 실행되고 결과가 출력됩니다. 코드 셀은 여러 번 실행할 수 있으며, 실행 결과는 셀 아래에 표시됩니다.
- 마크다운 사용하기
- Markdown 셀에서는 일반 텍스트 뿐만 아니라 제목, 목록, 링크, 그림 등 다양한 형식의 텍스트를 작성할 수 있습니다. Markdown 형식을 사용하여 문서를 작성하는 방법은 다양한 참고 자료를 통해 익힐 수 있습니다.
- 노트북 저장하기
- 노트북은 자동으로 주기적으로 저장되지만, 수동으로 저장하는 것도 가능합니다. 노트북을 저장하려면 툴바의 "Save" 버튼을 클릭하거나, 메뉴의 "File" > "Save and Checkpoint"를 선택하세요.
- 주피터 노트북 단축키 (빈도수 높은)
(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 장단점
장점
- 인터랙티브한 개발 환경 제공: Jupyter Notebook은 코드와 결과물을 한 곳에서 통합하여 보여주기 때문에, 데이터 분석 및 개발 작업을 보다 편리하게 수행할 수 있습니다.
- 텍스트와 코드의 조합: Markdown 셀을 사용하여 문서화된 코드와 설명을 함께 작성할 수 있어, 코드의 이해도와 공유성을 높일 수 있습니다.
- 다양한 확장 기능: Jupyter Notebook은 다양한 확장 기능을 제공하고 있으며, 사용자의 요구에 따라 기능을 추가하거나 커스터마이징할 수 있습니다.
단점
- 성능 문제: Jupyter Notebook은 대량의 데이터 처리에는 적합하지 않을 수 있습니다. 큰 데이터셋을 다룰 경우, 다른 개발 환경을 고려해야 합니다.
- 공개 시 주의사항: Jupyter Notebook은 코드와 결과를 함께 저장하므로, 코드를 공개할 때 비즈니스 로직이 노출될 수 있으므로 주의해야 합니다.
5.6 마무리
이상으로 Jupyter Notebook의 설치와 사용 방법에 대해 알아보았습니다. Jupyter Notebook은 데이터 분석 및 프로그래밍 작업을 편리하게 수행할 수 있는 강력한 도구입니다. 다양한 기능과 확장성을 활용하여 보다 효율적인 작업을 진행해보세요!
출처: https://recording-it.tistory.com/40 [나를 위한 꾸준한 기록:티스토리]
댓글