머신러닝이랑 딥러닝 파트를 공부하다 보면 수많은 모듈과 패키지를 사용하는걸 볼 수 있습니다.
__name__=="__main__"
위의 코드같은걸 수많이 보고 써왔지만, 정확히 뭘 의미하는지 알지 못하고 썼던거같아요.
저도 수많은 코드와 논문들을 보면서 제대로 개념이 안잡혀서 맨날 헷갈렸는데 이.번.기.회에 한번 제대로 이해해보려고 해요 :)
1.모듈
python은 모듈이라는 기능을 활용해 코드를 분리하고 공유합니다. 모듈은 여러 변수와 함수를 가지고 있는 집합체로, 크게 표준 모듈, 외부 모듈로 나뉘는데, 기본 내장되어 있는 모듈은 '표준 모듈', 다른 사람이 만든 모듈을 '외부 모듈'이라고 부릅니다.
1)표준 모듈
표준 모듈은 위에서 말했다 시피 기본 내장되어 있는 모듈을 의미합니다. 따로 다운할 필요 없이 기본으로 내장되어 있는 모듈인데요. 예를들면 import math, import random, import sys등이 있습니다. 표준 모듈에 관한 변수와 함수내용은 https://docs.python.org/ko/3/library/index.html 을 참고하면 바로 알 수 있습니다!!
2)외부 모듈
머신러닝이나 딥러닝쪽 공부 혹은 데이터 분석을 공부하고 있는 여러분들이 가장 많이 쓰는 사이킷런, 텐서플로, 넘파이,장고 등이 외부 모듈입니다. 외부 모듈은 따로 내장되어 있지 않아서 cmd 에 'pip install 모듈 이름'으로 다운을 받는데요.
각자가 원하는 딥러닝이나 머신러닝 , 데이터분석 모듈이름이 다 다르기 때문에 각자 필요한것을 찾아 사용하시면 됩니다.
특히 파이토치나 텐서플로우 등은 다운 받을때 확인해야하는 몇개가 존재합니다! 확인하고 다운해주세용 :)
3)라이브러리와 프레임워크
모듈을 살펴보면 라이브러리와 프레임워크라는 말을 많이 듣습니다.최근에는 큰 구분 없이 사용하지만, 약간의 차이가 있습니다. 확실하게 구분하자면 제어 역전(IoC:Inversion of Control) 여부에 따라서 달라집니다. 라이브러리는 정상적인 제어하는 모듈이고 프레임워크는 제어 역전이 발생하는 모듈입니다. 그럼 제어 역전이 무엇이냐 말 그대로 제어가 역전되어있다는 뜻인데요. 이렇게 말해도 이해를 잘 못해서 예시를 찾아봤습니다.
import math
print(sin(1))
print(cos(1))
print(tan(1))
print(floor(2.5))
print(ceil(2.5))
위 코드를 보면 math 모듈의 내부기능을 제가 직접 불러와서 사용했습니다.이걸 라이브러리라 부릅니다.그럼 아래코드를 한번 볼까요??
import Flask
app=Flask(__name__)
@app.route("/")
def hello():
return"<h1>Hello World!<h1>"
이코드를 보게 되면 우리가 코드를 직접 실행하지 않았는데, Flask모듈이 제공하는 명령어를 실행하면 Flask가 내부적으로 서버를 실행후 지정한 파일을 읽어들여 적절한 상황에 스스로 실행하게 됩니다. 이처럼 모듈이 개발자가 작성한 코드를 실행하는 형태의 모듈을 프레임 워크라고 부릅니다.
4)데코레이터
파이썬에는 @로 시작하는 구문을 파이썬에서는 '데코레이터'라고 부릅니다. 데코레이터는 함수나 메서드에 적용되어 함수나 메서드의 기능을 확장하거나 변경하는 역할을 합니다.데코레이터는 만드는 방법에 따라 함수 데코레이터와 클래스 데코레이터로 나눌 수 있습니다.이분 블로그 참고했으니까 한번 보시는 것도 강추입니다:)
https://ctkim.tistory.com/entry/%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0decorator
2.모듈 만들기
모듈을 만드는 방법은 단순하고 쉬워서 길게 할말이없습니다. 모듈 내부에 변수와 함수들을 넣어놓으면됩니다!!
여러분들은 if __name__=="__main__"라는 코드를 보신적이 있나요?? 전 진짜 많이 봤고 사용했지만, 사실 뭘 의미하는지는 이번에 제대로 배웠습니다!
파이썬 코드 내부에는 __name__이라는 변수를 사용할 수 있습니다.
프로그램의 진입점을 엔트리 포인트 또는 메인이라고 부르는데, 이러한 엔트리 포인트 또는 메인 내부에서의 __name__은 "__main__"입니다.
print(__name__)
>>__main__
파이썬 파일을 커맨드 라인이나 인터페이스를 통해 직접 실행할 경우 __name__에는 __main__이라는 값이 설정됩니다.
import test1
print(test1.__name__)
#출력:test1
하지만 파이썬 모듈로써 사용,즉 다른 파일에서 불러와 사용하는 경우에는 __name__은 모듈이름이 설정됩니다.
정리하자면 if__name__=="__main__"은 해당 구문이 사용된 파이썬 파일을 직접 실행했을때만 아래코드를 실행하겠다라는 의미입니다.
###TEST1.py
print("ㅎㅇㅎㅇ")
###TEST2.py
import TEST1
print("ㅎㅇ")
>>>ㅎㅇㅎㅇ
>>>ㅎㅇ
다음과 같이 ㅎㅇ만 출력했어야했는데 import된것도 나오네요 ㅠ 이런 경우를 방지하기 위해서 if __name__=="__main__" 을 활용해서 아래와 같이 코드를 바꾸는겁니다.
###TEST1.py
if __name__=="__main__":
print("ㅎㅇㅎㅇ")
###TEST2.py
import TEST1
print("ㅎㅇ")
>>>ㅎㅇ
이제 완벽히 이해한거같습니다. 그럼 패키지 만드는 법을 볼까요??
3.패키지 만들기
모듈이 모여 패키지가 됩니다. 패키지안에 모듈을 하나이상 넣으면 됩니다. 하고나서 import하면 모듈을 불러와서 엔트리포인트에서 사용이 가능합니다. 여기서 "__init__.py"를 보신적이 있나요? __init__py은 뭔지 지금 보겠습니다.:)
__init__.py은 패키지를 읽을 때 어떤 처리를 수행해야 하거나 패키지 내부의 모듈들을 한꺼번에 가져오고 싶을 때가 있습니다. 이럴떄는 패키지 폴더 내부에 __init__.py파일을 만들어 사용합니다. __init__.py는 해당 폴더가 패키지임을 알려주고, 패키지와 관련된 초기화 처리를 하는 파일입니다 __init__.py에 __all__이라는 이름의 리스트를 만드는데, 이 리스트에 지정한 모듈들이 from<패키지이름> import * 을 할때 전부 읽어 들여집니다.
#testpacket/__init__.py
__all=["A","B"]
print("testpacket읽어옴")
#main.py
from testpacket import *
print(A.A함수())
print(B.B함수())
위와 같이 모든 함수를 한번에 불러올 수 있게 해주는 과정이였습니다. 이번 수업에서 제가 헷갈렸던 부분이나 평소에 궁금했던 부분을 정리해봤습니다. 사실 파이썬의 기초는 어느정도 알고있고, 알고리즘이나 여러 코딩테스트 문제를 풀면서 실력을 키우는게 맞다고 보는 사람이지만, 코테나 알고리즘에서는 위와 같은 기본 내용은 몰라도 해결할수 있다보니!! 이번 내용이 참 유익했다고 생각합니다.:)
'Study > PYTHON,Django' 카테고리의 다른 글
Django(2)-데이터베이스 연동 (0) | 2024.01.25 |
---|---|
Django(1)-웹 프로그래밍 기초 (0) | 2024.01.24 |
Python(4)-OOP심화 (0) | 2024.01.19 |
PYTHON(3)-객체지향(OOP) (0) | 2024.01.09 |
Python(1)-Python 기초 (0) | 2024.01.02 |