❤️ 파이썬의 장점 ❤️
어떤 기능을 위한 코드들이 이미 만들어져 있다. = 패키지
유용한 패키지가 아주 많다. 전 세계 각지에서 누군가가 새로운 패키지를 개발하고 있어 그 수는 점점 늘고 있다.
따라서 파이썬으로 프로그램을 개발할 때 어떤 기능이 필요하다면 처음부터 무작정 개발하기보다 이미 잘 만들어진 패키지가 있는지 확인해 보는 편이 낫다.
모든 긴으을 구현하는 것도 중요하지만, 필요한 라이브러리를 잘 찾아서 프로젝트에 적용하는 것도 뛰어난 개발자의 덕목이자 개발 생산성을 향상시킬 수 있는 훌륭한 전략이다.
module
전체 프로그램을 바꾸지 않고 코드 일부만 교체하거나 추가할 수 있게 만들면 유지보수도 쉽고 코드의 재사용성도 높아진다. 파이썬에서는 서로 관련이 있거나 비슷한 기능을 하는 함수, 클래스 등을 담고 있는 파일을 제공하는데 이를 module이라고 한다.
modularization
파이썬에서 개발을 용이하게 하기 위해 프로그램의 기능을 독립적인 작은 단위로 나누는 작업을 모듈화(modularization)라고 한다.
모듈 만들기
1. C언어와 달리 확장자는 '.py' 그대로 작성하면 된다.
2. 기존 모듈과 동일하게 'import 모듈명' 해주면 된다.
3. 모듈에 있는 함수를 사용할 때에는
모듈명.함수명(전달값)
이렇게 쓰면 됨.
근데 모듈명이 길면 불편함.
import 모듈명 as 줄임말
이렇게 사용하면
줄임말.함수명(전달값)
이렇게 사용하면 돼서 개편함.
from 모듈명 import 기능(or 함수)
from 모듈명 import *
모든 기능을 가져다 쓰겠다는 의미
*는 모든 것을 지칭할 때 사용하는 와일드카드 문자이다.
가져온 기능or함수도 줄임말을 사용해서 코드를 작성할 수 있다.
from 모듈명 import 기능or함수 as 줄임말
패키지(package)
프로그램의 규모가 커지면 모듈 하나만으로 관리하기 어렵다.
그래서 관련 있는 기능끼리 모듈로 모으고, 다시 모듈을 합쳐 패키지로 묶는다.
잘 만들어진 패키지가 있으면 파이썬 프로그램을 개발할 때 해당 패키지를 설치해 바로 사용할 수 있다.
그러면 어떤 기능이 필요할 때 코드를 처음부터 새로 작성할 필요가 없다.
패키지 만들기
1. 작업 폴더 안에 새로운 폴더를 만든다. [ New Folder ]
2. 새로 만든 폴더 안에 [ New File ] 로 새로운 모듈 파일들을 만든다.
3. __init__.py 파일도 만든다.
해당 폴더가 패키지라는 것을 평시하기 위해 만드는 것이다. (1)에서 만든 폴더에 __init__.py 파일을 만들어 두면 해당 폴더를 패키지로 인식한다. |
4. import 패키지명.모듈명
from 패키지명 import 모듈명
패키지명 = 폴더명
모듈명 = .py명
※ import명을 사용할 때에는 대상이 모듈이나 패키지여야 한다. class나 함수는 가져올 수 없다. class 는 from~import 문을 사용해서 가져올 수 있다. from 패키지명.모듈명 import 클래스명or함수명 |
__all__ (모듈 공개 설정하기)
__init__.py 파일을 열어 다음과 같이 작성하면
__all__ 이라는 변수에 리스트 형태로 모듈명을 넣으면 해당 모듈을 공개로 설정한다.
※ *를 이용해 패키지 내 모듈들을 가져다 쓰려고 하는 경우에 import할 대상을 정의하는 역할을 한다.
__init__.py |
__all__ = ["vietnam", "thailand"] # vitnam, thailand 모듈 공개 |
from travel import *
# trip_to = vietnam.VietnamPackage()
trip_to = thailand.ThailandPackage() # 태국
trip_to.detail()
※ 이건 이미 from ~ import * 를 작성했을 때 사용하는 방법이지
이렇게 작성하지 않아도 import 모듈명 으로 작성하는 방법도 있다는 점을 기억해 두자.
※ NameError 오류 발생
프로그램 실행 시 'NameError: name 'thailand' is not defined'라는 메시지가 나오면서 오류가 발생한다면
해당 패키지의 __init__.py 파일의 __all__ 변수에 thailand 모듈이 추가되어 있는지 확인하자.
모듈 직접 실행하기
우리가 예시로 드는 모듈들은 내용이 간단해서 파악하기 쉽지만, 실제 프로그램에서 모듈을 만들면 규모나 복잡도가 다르다. 그래서 모듈의 기능이 올바르게 동작하는지 확인하는 작업이 필요하다.
지금까지 이행한 방법은 별도 파일에 해당 모듈을 import해서 테스트한 것이고,
더 수월하게 모듈을 직접 실행하면서 확인하는 방법을 알아보자.
모듈을 직접 실행할지 or 별도 파일을 호출해서 실행할지는 다음과 같이 구분
형식 |
if __name__ == "__main__": # 직접 실행하는 경우 pass else: # 외부에서 호출해 실행하는 경우 pass |
__name__
현재 모듈(작성한 파이썬 파일)의 이름을 값으로 가지는 내장 변수.
* 내장 변수 : Python에서 어떻게 사용할지 역할이 이미 정의되어 있는 변수
그래서 앞의 코드와 같이 작성하면 파일이 직접 실행될 때 if문의 동작이 실행된다.
직접 실행되지 않고 외부에서 호출해 사용하면 __main__이 아닌 해당 모듈의 이름을 값으로 갖기게 된다.
모듈이 직접 실행되는 경우 __name__의 값은 __main__으로 설정된다.
예시
class ThailandPackage:
def detail(self):
print("[태국 3박 5일 패키지] 방콕, 파타야 여행(야시장 투어) 50만 원")
if __name__ == "__main__": # 모듈 직접 실행
print("thailand 모듈 직접 실행")
print("이 문장은 모듈을 직접 실행할 때만 출력돼요.")
trip_to = ThailandPackage()
trip_to.detail()
else: # 외부에서 모듈 호출
print("외부에서 thailand 모듈 호출")
패키지와 모듈 위치 확인하기
패키지나 모듈은 호출하려는 파일과 동일한 경로에 있거나 파이썬 라이브러리(library)들이 모여 있는 폴더에 있어야 사용할 수 있다. 모듈을 문제없이 사용하려면 모듈의 위치를 알아야 한다.
※ Library 라이브러리는 재사용을 위해 개발한 코드 묶음이다. 모듈 묶음이 패키지라면, 패키지 묶음이 라이브러리인데, 파이썬에서 라이브러리는 패키지와 혼용하는 용어라 둘을 크게 구분하게 않아도 괜찮음ㅇㅇ |
getfile()
파이썬에서는 getfile() 함수로 모듈의 경로를 확인할 수 있다.
1) getfile() 함수는 inspect라는 모듈에 속하므로 먼저 inspect 모듈을 import해야 한다.
2) 또한, 경로를 파악할 모듈도 import해야 한다.
3) getfile() 함수에 전달값으로 random을 넣은 후 실행하면 모듈의 경로를 반환한다.
import inspect
import random
print(inspect.getfile(random)) # random 모듈 위치(경로)
실행결과 |
C:\Python38\lib\random.py |
개발 환경을 설정할 때 지정한 파이썬 경로의 lib 폴더 안에 있는 것을 확인할 수 있다. 여기서는 lib 폴더 = 파이썬 라이브러리들이 모여 있는 폴더 |
※ 직접 개발한 모듈이나 패키지도 파이썬 라이브러리들이 모여 있는 폴더인
개발 환경을 설정할 때 지정한 폴더(여기서는 lib 폴더)에 넣어 두면 다른 파이썬 프로그램을
만들어 작성할 때에도 사용할 수 있다.
패키지 설치하기
1) PyPI(The Python Package Index) 사이트에 접속한다.
PyPI · The Python Package Index
The Python Package Index (PyPI) is a repository of software for the Python programming language.
pypi.org
해당 사이트는 파이썬용 패키지 저장소이다.
실습용으로 웹 스크래핑 분야에서 유명한 <BeautifulSoup4>라는 패키지를 찾아 설치하자.
2) 프로젝트 페이지에 접속하여 패키지 설치 명령을 복사한뒤 VSCode의 터미널에 입력한다.
3) 설치가 끝나면 프로젝트 페이지의 Quick start에 나온 예제 코드를
내장 함수(build-ins) 사용하기
파이썬은 프로그램을 더 빠르고 편리하게 개발할 수 있도록 유용한 기능을 담은 내장 함수와 외장 함수를 제공한다.
내장 함수 : 별도로 import하지 않고도 사용할 수 있는 함수
- Google에 < list of python builtins >을 검색하거나
- 파이썬 공식 홈페이지의 내장 함수 소개 페이지를 방문하여 확인할 수 있다.
https://docs.python.org/3/library/functions.html
Built-in Functions
The Python interpreter has a number of functions and types built into it that are always available. They are listed here in alphabetical order.,,,, Built-in Functions,,, A, abs(), aiter(), all(), a...
docs.python.org
위 페이지는 내장 함수가 알파벳순으로 정렬되어 있다. KR도 지원함.
dir()
어떤 객체를 전달값으로 넘기면 이 객체가 어떤 변수와 함수를 가지고 있는지 알려 준다.
만약 전달값으로 아무것도 넣지 않으면 현재 소스 코드 안에서 사용할 수 있는 모듈 or 객체를 출력한다.
예시1
print(dir())
import random # random 모듈 가져다 쓰기
print(dir())
import pickle # pickle 모듈 가져다 쓰기
print(dir())
실행 결과 |
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__'] ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'random'] ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'pickle', 'random'] |
예시2
import random
print(dir(random))
실행 결과 |
['BPF', 'LOG4', 'NV_MAGICCONST', 'RECIP_BPF', 'Random', 'SG_MAGICCONST', 'SystemRandom', 'TWOPI', '_Sequence', '_Set', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_accumulate', '_acos', '_bisect', '_ceil', '_cos', '_e', '_exp', '_inst', '_log', '_os', '_pi', '_random', '_repeat', '_sha512', '_sin', '_sqrt', '_test', '_test_generator', '_urandom', '_warn', 'betavariate', 'choice', 'choices', 'expovariate', 'gammavariate', 'gauss', 'getrandbits', 'getstate', 'lognormvariate', 'normalvariate', 'paretovariate', 'randint', 'random', 'randrange', 'sample', 'seed', 'setstate', 'shuffle', 'triangular', 'uniform', 'vonmisesvariate', 'weibullvariate'] |
예시3: 자료구조 '리스트'
리스트 자료구조를 하나 만들어 확인. => 해당 자료구조인 리스트에서 사용할 수 있는 변수와 함수 목록이 나온다.
lst = [1, 2, 3]
print(dir(lst))
실행 결과 |
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'] |
예시4: 문자열 변수
name = "Jim"
print(dir(name))
실행 결과 |
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'] |
외장 함수(module) 사용하기
파이썬을 설치할 때 함께 설치되며 파이썬 라이브러리들이 모여 있는 폴더이자 개발 환경 설정 시 지정한 폴더인 lib 폴더에 담겨 있다. 내장 함수와는 다르게 반드시 import해야만 프로그램 안에서 사용할 수 있다.
- Google에 < list of python modules >를 검색하거나
- 파이썬 공식 홈페이지의 모듈 인덱스 페이지를 방문하여 확인할 수 있다.
https://docs.python.org/3/py-modindex.html
Python Module Index — Python 3.12.4 documentation
numbers Numeric abstract base classes (Complex, Real, Integral, etc.).
docs.python.org
모듈은 굉장히 유용해서 많이 알수록 좋지만, 모두 외울 수는 없다.
그래도 한 번쯤 어떤 모듈이 있는지 모듈명 정도는 훑어보자.
Module(1): glob 모듈 (폴더 or 파일 목록 조회 모듈)
모듈 설명 : https://docs.python.org/ko/3/library/glob.html#module-glob
어떤 경로에 있는 폴더 or 파일 목록을 조회할 때 사용한다.
윈도우의 명령 프롬프트에서 사용하는 dir 명령과 유사.
glob Module에는 glob() 함수가 있는데, 파일명 or 비슷한 형태를 전달하면 해당하는 파일을 조회한다.
확장자가 py인 파일을 출력하자.
import glob
print(glob.glob("*.py")) # 확장자가 py인 모든 파일 출력
실행 결과 |
['class_pass.py', 'helloworld.py', 'myclass_study.py', 'myglob.py', 'PacDown.py' |
현재 작업 폴더에 존재하는 .py로 끝나는 모든 파일을 출력한다.
Module(2): os (운영체제의 기본 기능 모듈)
os는 OS에서 제공하는 기본 기능( i.e., 폴더를 만들거나 삭제하는 기능) 정도로 생각하면 된다.
Module(2)-2: path
경로 정보를 처리하기 위해 os 모듈에서 import해서 사용하는 또 다른 모듈이다.
os 모듈 내에서 import하기 때문에 따로 import문을 작성할 필요는 없다.
- getcwd()
getcwd() 함수는 os 모듈에 속한 함수로, 현재 Python 파일을 실행하는 경로 정보를 알려주는 함수이다.
* cwd (current working directory) : 현재 작업 폴더
import os
print(os.getcwd()) # 현재 작업 폴더 위치(경로)
- path.exists()
주어진 경로에 해당하는 폴더 or 파일이 존재하는지 여부를 알려주는 함수
- makedirs()
현재 위치에 폴더를 새로 생성
import os
folder = "sample_dir"
if os.path.exists(folder): # 같은 이름의 폴더가 존재한다면
print("이미 존재하는 폴더입니다.")
else: # 폴더가 존재하지 않으면
os.makedirs(folder) # 폴더 생성
print(folder, "폴더를 생성했습니다.")
실행결과 |
sample_dir 폴더를 생성했습니다. |
이미 존재하는 폴더입니다. |
- rmdir()
* r = remove
import os
folder = "sample_dir"
if os.path.exists(folder): # 같은 이름의 폴더가 존재한다면
print("이미 존재하는 폴더입니다.")
os.rmdir(folder) # 폴더 삭제
print(folder, "폴더를 삭제했습니다.") # 삭제 문구 출력
else: # 폴더가 존재하지 않으면
os.makedirs(folder) # 폴더 생성
print(folder, "폴더를 생성했습니다.")
실행결과 |
이미 존재하는 폴더입니다. sample_dir 폴더를 삭제했습니다. |
- listdir() 함수
glob Module의 glob() 함수와 비슷하게 현재 작업 폴더 안에 있는 폴더와 파일 목록을 출력한다.
import glob
print(glob.glob("*.py"))
import os
print(os.listdir())
실행결과 |
['class_pass.py', 'helloworld.py', 'myclass_study.py', 'myglob.py', 'PacDown.py'] ['.venv', 'class_pass.py', 'helloworld.py', 'myclass_study.py', 'myglob.py', 'PacDown.py'] |
Module(3): time (시간 관련 모듈)
시간 관련 함수를 제공하는 모듈
- localtime()
현재 시간 정보를 반환하는 함수
import time
print(time.localtime())
실행결과 |
time.struct_time(tm_year=2024, tm_mon=7, tm_mday=21, tm_hour=4, tm_min=43, tm_sec=26, tm_wday=6, tm_yday=203, tm_isdst=0) |
- strftime()
국가에 따라 일, 월, 연의 순서를 다르게 표시한다.
strftime() 함수를 이용하면 사용자가 원하는 문자열 형태로 시간 정보를 출력할 수 있다.
이 때 주로 사용되는 코드는 다음과 같다.
No. | 코드 | 의미 |
1 | %Y | 연 (year) |
2 | %m | 월 (month) |
3 | %d | 일 (day) |
4 | %H | 시 (hour) |
5 | %M | 분 (minute) |
6 | %S | 초 (second) |
※ 코드는 대소문자를 구분하므로 유의할 것
import time
print(time.strftime("%Y-%m-%d %H:%M:%S")) # 연-월-일 시:분:초
실행결과 |
뭐야오류뜸 |
Module(4): datetime (날짜 관련 모듈)
- date.today()
현재 시간 정보
import datetime
print("오늘 날짜는", datetime.date.today())
실행결과 |
오늘 날짜는 2024-07-21 |
- timedelta()
두 날짜 및 시간 사이 차이를 계산하거나 일정 시간이 경과한 후의 날짜 등을 구할 수 있다.
import datetime
today = datetime.date.today() # 오늘 날짜 저장
td = datetime.timedelta(days=100) # 100일째 날짜 저장
print("우리가 만난 지 100일은", today + td) # 오늘부터 100일 후 날짜
실행결과 |
우리가 만난 지 100일은 2024-10-29 |
'Programming Language > Python' 카테고리의 다른 글
[Python] 기본 문법(15): pip 명령어 (0) | 2024.07.21 |
---|---|
[Python] 나도코딩 파이썬 입문 - 문풀 Part11 (0) | 2024.07.21 |
[Python] 나도코딩 파이썬 입문 - 문풀 Part10 (0) | 2024.07.21 |
[Python] 기본 문법(13): 예외 처리 try-except문, Exception, as, specion/dounder method(init, str, len, contains), finally (0) | 2024.07.21 |
[Python] 나도코딩 파이썬 입문 - 문풀 Part9 (0) | 2024.07.20 |