2주차 미션활동은
section2를 공부하고 포스팅을 하는 거에요!
하루에 강의 1개 분량이 약 20분정도니까,
하루면 금방 끝나겠네! 했는데,,
강의 듣고나서
모르는 부분들에 대해 추가 조사를 하다보니까
1개 듣는 것도 버거워요,, ㅠㅠ
모르는 내용이 끝없이 나오더라구요
그래서 학교 수업이 있는 날 제외하고는
꾸준하게 강의 1개 이상 들어보려고 합니다 :0
context manager는
일반적으로 파일을 잠그거나 해제하거나, 열려있는 파일들을 닫을 때
주로 사용한다.
최소한 context manager는 __enter__와 __exit__메소드를 가지고 있다.
Contextlib
: with문 컨텍스트를 위한 유틸리티
@contextlib.contextmanager
> 이 함수는 클래스나 별도의 __enter__()와 __exit__() 메서드 작성이 필요 없이,
with문 컨텍스트 관리자를 위한 팩토리 함수를 정의하는 데
사용할 수 있는 데코레이터이다.
>> 제너레이터, 데코레이터를 활용해서
컨텍스트 매니저를 좀 더 직관적이고 쉽게 향상시킬 수 있다.
* 데코레이터 (decorator)
: 보통 @wrapper 문법을 사용한 함수 변환으로 적용되고,
다른 함수를 돌려주는 함수이다..?
다른 함수를 돌려준다니.. 함수를 반환한다는 말일까?
>> 함수를 받아 명령을 추가한 뒤에
이를 다시 함수의 형태로 반환하는 함수이다.
데코레이터를 언제 사용할까?
함수의 내부를 수정하지 않고, 기능에 변화를 주고 싶을 때 주로 사용한다.
예를 들자면,
def main_func() 함수에는
"hello world"를 출력하는 구문이 있다.
그런데 나는 hello world 앞에 현재 시간이 나오도록 설정하고 싶다.
그러면 이 경우에는,
main_func에
print(datetime.datetime.now())를 입력하면 된다.
그러나 함수가 여러개라면?
def main_func1()
def main_func2()
....
일일이 다 여기에 시간 출력 구문을 입력하면,
코드의 가독성도 떨어질 것이고 소스의 양도 많아진다.
그럴 때 데코레이터를 사용하는 것이다!
def nowtime_decorator(func):
def decorated():
print(datetime.datetime.now())
return decorated
@nowtime_decorator
def main_func1:
print('hello world_1')
'''
main_func1=nowtime_decorator(main_func1)이랑 같은 의미
nowtime_decorator라는 함수가 main_func1 함수를 꾸며서 새로운 함수를 만들어낸 것이다.
'''
@nowtime_decorator
def main_func2:
print('hello world_2')
즉,
기존 함수에다가
내용을 덧붙이는? 그런 개념이다.
언제든 변경될 수 있는 내용이라
기존 함수를 바꾸기엔 적절치 않다고 판단될 때
데코레이터를 사용한다.
※ 데코레이터 주의사항
: 데코레이터는
작업의 앞 뒤에 추가적인 작업을 사용하도록 도와주는 역할이다.
함수 중간에 끼어들 수 없다.
* 데코레이터 구조
yield문
: 제너레이터 함수나 비동기 제너레이터 함수를 정의할 때 사용한다.
그래서 함수 정의의 바디안에서만 사용할 수 있다.
함수의 바디에서 yield를 사용하는 것은
함수를 제너레이터로 만들고,
yield 값
비동기 함수 바디에서 사용하는 것은
코루틴 함수를 비동기 제너레이터로 만든다.
Generator
Generator는 iterator를 생성해주는 함수이다.
제너레이터는 함수 안에서 yield라는 키워드만 사용하면 끝!
이터레이터보다 훨씬 간단하게 작성할 수 있다.
이터레이터는 __next__ 메서드 안에서 직접 return으로 값을 반환하지만,
제너레이터는 yield에 지정한 값이 __next__메서드의 반환값으로 나온다.
이터레이터는 raise로 stopIteration 예외를 직접 발생시켰지만,
제너레이터는 자동으로 발생한다.
제너레이터 객체에서 __next__ 메서드를 호출할 때 마다
함수 안의 yield까지 코드를 실행하며
yield에서 값을 발생시킨다.
[generate 사전적 의미]
: 일으키다
docs.python.org/ko/3/library/contextlib.html
강의 명 :
모두를 위한 파이썬 : 필수 문법 배우기 Feat. 오픈소스 패키지 배포
강의 링크
'여니의 Side Project > 인프런 - 리프 (파이썬 고급)' 카테고리의 다른 글
[인프런 리프 대학생 2기] 3주차(1) | Chapter 3. Meta Class (0) | 2021.03.26 |
---|---|
[인프런 리프 대학생 2기] 2주차 미션활동 (0) | 2021.03.18 |
[인프런 리프 대학생 2기] 1주차 미션 활동 | Context Manager(1) (0) | 2021.03.14 |
[인프런 리프 대학생 2기] 1주차 미션 활동 Python Advanced(1) (0) | 2021.03.13 |
[인프런 리프 대학생 2기] 1주차 미션 활동 (섹션0. 환경설정편) (0) | 2021.03.13 |