Programming/Python
[AI 기초 다지기] 파이썬 Module and Project
aram
2022. 8. 2. 16:56
- 모듈 (Module) in Python
- 다른 사용자에 의해 구현된 프로그램을 사용할 때의 기본적인 체계 > 모듈화
- 모듈은 패키지 안에 들어있는 작은 프로그램 조각들
> 레고 블록와 같은
> 하나의 프로그램을 작성하는 기준 - 파이썬 프로그램 구현 단위, 관리 단위, .py파일에 물리적 매핑
- 파일이름이 모듈명이 되며, 연된변 변수·함수·클래스들을 그룹핑해서 정의 한 것
- 모듈들을 모아서 폴더 단위로 묶어서 패키지를 만들고 패키지를 공개한 게 프로젝트
- 음식점의 메뉴판 처럼 인터페이스를 사용해서 서로 다른 모듈 연결 = 약결함(느슨한 결합)
- Module 만들기
- 파이썬의 Module == py 파일을 의미
- 같은 폴더에 Module에 해당하는 .py 파일과 사용하는 .py을 저장한 후
def covert_c_to_f(celcius_value):
return celcius_value * 9.0 / 5 + 32
- import 문을 사용해서 module을 호출 > 모듈.함수() 구조로 사용
>>> import fah_converter #위의 모듈 호출
>>> fah_converter.covert_c_to_f(42.6)
108.68
- 호출하면 __pycache__ 폴더 생성됨
> 파이썬이 빠르게 로딩할 수 있게 컴파일 시켜준 것
def covert_c_to_f(celcius_value):
return celcius_value * 9.0 / 5 + 32
#모듈을 호출하면 모듈 안의 함수가 다 호출됨
test = "GGG"
print(test)
#그래서 이렇게 하면 import로 불렀을 때 test가 바로 출력됨
if __name__ == '__main__':
test = "GGG"
print(test)
#이렇게 적어줘야 출력이 안 됨.
- namespace 네임스페이스 ; 이름 공간
- 모듈 안에는 함수와 클래스 등이 존재 가능
- 필요한 내용만 골라서 호출 할 수 있음
- from 과 import 키워드를 사용함
- Alias 설정하기 – 모듈명을 별칭으로 써서 >읽기 편한 코드는 어디서 불러왔는 지 다 보여주는 것이 좋음
import fah_converter as fah #as 이하가 별칭
print(fah.covert_c_to_f(41.6))
> fah_converter를 fah라는 이름으로 그 안에 covert_c_to_f 함수를 사용
- 모듈에서 특정 함수 또는 클래스만 호출하기
from fah_converter import covert_c_to_f #사용할 함수 또는 클래스만 import
print(covert_c_to_f(41.6))
from fah_converter import covert_c_to_f ad cf #여기서 별칭도 가능
print(cf(41.6))
> covert_c_to_f 함수만 호출 > 읽는 사람 입장에서는 이 함수가 어디서 왔는지 모를 수 있음
- 모듈에서 모든 함수 또는 클래스를 호출하기
from fah_converter import * # *f로 전체 호출
print(covert_c_to_f(41.6))
- global namespace 전역 네임스페이스
- 모듈 단위로 하나의 이름 관리 영역
- Built-in Modules 내장 모듈
- 파이썬이 기본 제공하는 라이브러리 > python설치 파일과 함께 제공되는 파일
- 문자처리, 웹, 수학 등 다양한 모듈이 제공됨
- 별다른 조치없이 import 문으로 활용 가능
- random모듈
- .seed([x]) : 임의 숫자 생성기 초기화 작업
- .random() : 0.0 이상 1.0 미만의 실수(float)를 리턴(반환)
- .randint(start, end) : start 이상 end 이하의 정수(int)를 리턴(마지막 숫자 포함)
- .randrange(start, end, step) : start이상 end 미만 step의 배수를 리턴
- .uniform(a, b) : 인자로 받은 a와 b값 사이의 임의의 float 숫자 반환
- .gauss(m, sb) : 가우스 분포의 난수 반환
- .choice(시퀀스 자료형) : 시퀀스 자료형에 저장된 item 중에 하나의 임의의 값(숫자)를 리턴
- .sample(range(start, end), n) : start 이상 end 미만의 n개 값(시퀀스 자료형)을 리스트 형식으로 반환 (중복 없음)
- .shuffle(x[,random]) : 입력받은 시퀀스 객체를 랜덤으로 섞음
- .seed([x]) : 임의 숫자 생성기 초기화 작업
#난수
>>> import random
>>> random.randint(0,100)
99
>>> random.random
<built-in method random of Random object at 0x000001F73493FF70>
>>> print(random.random())
0.010461114183266784
- datetime 모듈
- 기념일과 같은 날짜, 시간 연산을 위하여 사용
- .date - 일반적으로 사용되는 그레고리안 달력(Gregorian Calendar)의 년, 월, 일을 표현
- .fromisoformat() - 날짜형식의 문자열을 date객체로 변환
- .time - 시간을 시, 분, 초, 마이크로 초, 시간대(Time zone)로 표현
- .datetime - date 클래스와 time 클래스의 조합으로 구성
- .timedelta - 두 날짜 혹은 시간 사이의 기간을 표현
from datetime import date
d1 = date(2021, 12, 29) #날짜 객체 생성
print(d1, type(d1)) #2021-12-29 <class 'datetime.date'>
d2 = date.today() #오늘 날짜 반환
print(d2, type(d1)) #2022-08-11 <class 'datetime.date'>
#국제표준 iso- DD-MON-YY, YY/MM/DD
print(d2.isoformat()) #2022-08-11
print(type('2022-01-03')) #<class 'str'>
d3 = date.fromisoformat('2022-01-03')
print(d3, type(d3)) #2022-01-03 <class 'datetime.date'>
today = date.today()
print(today.year) #2022
from datetime import datetime, timedelta
todaytime = datetime.now()
print(todaytime) #2022-08-11 15:19:18.182580
print(todaytime + timedelta(hours=2)) #2022-08-11 17:19:18.182580 2시간 뒤의 시간 계산
- struct_time 시퀀스 객체 > strptime, strftime 형식 지정자
- strptime() : 날짜와 시간 형식의 문자열 > datetime 객체로 변환
- strftime() : datetime 객체를 문자열로 변환
- 축약 : %y 연도, %b 월, %a 요일
- 축약x : %Y 연도, %B 월, %A 요일
- 숫자표현 : %m 월(01~12), %w 요일
- %d 일(1~31)
- %H(00~23) %I(01~12) 시간
- %M 분(00~59)
- %S 초 (00~61)
- %p AM / PM
- %j 1월1일부터 누적된 날짜 (001~366)
- time 모듈
- 시간 표현
- .time - 1970년 1월 1일 0시 0분 0초 이후 경과한 시간을 초단위로 반환
- .sleep(secs) - 수행중인 프로세스를 잠시 몇초간 정지시킬 때
- .localtime([secs]) - 초를 입력받아서 지방표준시 기준의 struct_time 시퀀스 객체로 반환
- .gmtime([secs]) - 초를 입력받아서 UTC 기준의 struct_time 시퀀스 객체로 반환
- .asctime([t]) - struct_time 시퀀스 객체를 인자로 받아서 'Thu Aug 11 15:25:49 2022' 형태로 반환
- .mktime(t) - 지방표준시인 struct_time 시퀀스 객체를 인자로 받아서 time()과 같은 누적된 초 반환
import time
t = time.gmtime(1234567890)
time.asctime(t) #'Fri Feb 13 23:31:30 2009'
time.strftime('%c', time.localtime(time.time()))
#'Thu Aug 11 15:25:49 2022'
print(time.localtime())
#time.struct_time(tm_year=2022, tm_mon=8, tm_mday=2, tm_hour=14, tm_min=53, tm_sec=10, tm_wday=1, tm_yday=214, tm_isdst=0)
- Decimal 모듈
: 진법 변환 에러에 대해 정확한 결과 값을 얻도록 함
: 부동 소수점 방식 > 무한대로 빠지도 함.
: decimal.Decimal([value[,context]])
#decimal 사용하지 않을 경우
a, b = 90.7, 30.2
c =0.0002
print((a+b)+c) #120.90020000000001
#decimal 모듈의 사용방법
import decimal
a, b = decimal.Decimal('90.7'), decimal.Decimal('30.2')
c = decimal.Decimal('0.0002')
print((a+b)+c) #120.9002
#데시멀 속성을 이용한 자리수 표현
print(type(a/b)) #<class 'decimal.Decimal'>
print(a/b) #3.003311258278145695364238411
decimal.getcontext().prec = 3 #소수점 이하 프리시전을 세자리로 설정
print((a/b)) #3.00
# 올림연산으로 변경
decimal.getcontext().rounding = decimal.ROUND_CEILING
a / b #Decimal('3.01')
- keyword 모듈 : 파이썬의 키워드들을 문자열로 보관하는 하나의 변수 kwlist 정의
> 리스트로 보여줌
> 변수명, 함수명, 클래스명으로 사용불가 - pprint 모듈 : object에 출력 값을 넣고 출력할 때 들여쓰기(indent), 출력 라인 폭(width)등에 대한 조정 가능
- help() : 원하는 모듈의 도움말을 보여줌
import keyword
import pprint
pprint.pprint(keyword.kwlist, width=60, compact=True)
help(pprint) #도움말
- python 표준 모듈 https://docs.python.org/ko/3/library/index.html
- 정규표현식 Regular expression 문법
- 특정한 규칙을 가진 문자열을 표현하는데 사용되는 형식 언어
- 주어진 패턴으로 문자열을 검색/치환하는데 사용
- vi, grep 등 프로그램에서 널리 사용됨
. | 개행 문자를 제외한 1자 | * | 문자 0회 이상 반복 |
^ | 문자열의 시작 | + | 문자 1회 이상 반복 |
& | 문자열의 종료 | ? | 문자 0 or 1회 반복 |
[] | 문자의 집합 | {m} | 문자 m회 반복 |
| | OR | {m,n} | 문자 m회부터 n회까지 반복되는 모든 경우 |
() | 괄호 안의 정규식을 그룹으로 | {m.} | 문자 m회부터 무한반복되는 모든 경우 |
Escape 문자열 | |||
\w | _과 표현 가능한 문자 | \s | 공백 문자 |
\W | _과 표현 가능한 문자 제외한 나머지 | \S | 공백 문자를 제외한 모든 문자 |
\d | 0-9를 포함하는 모든 숫자 | \\ | 역슬래쉬(\) 문자 자체 |
\D | 숫자를 제외한 모든 문자 |
- re모듈
- .search(pattern, string, flags=0) : string 전체에 pattern이 일치하는 첫 번째 위치를 찾고, 대응하는 일치 객체를 반환
- .match(pattern, string, flags=0) : string 시작 부분에서 0개 이상의 문자가 정규식 pattern과 일치하면, 해당 일치 객체를 반환
- .split(pattern, string, maxsplit=0, flags=0) : pattern을 구분자로 string을 분리해서 list로 반환
- .findall(pattern, string, flags=0) : string에서 pattern과 매치되는 모든 경우를 찾아 리스트로 반환
- .sub(pattern, repl, string, count=0, flags=0) : string에서 pattern과 일치하는 부분에 대하여 repl로 치환하여 결과 문자열을 반환
import re
bool(re.match('ap', 'This in an apple'))
#False
print(re.match('[0-9]*th', '35th'))
#<re.Match object; span=(0, 4), match='35th'>
re.findall(r"app\w*", 'application orange apple bannana')
#['application', 'apple']
re.sub(r"[:,|\s]", ",", 'application:orange apple|bannana')
#'application,orange,apple,bannana'
- Package
- 하나의 대형 프로젝트를 만드는 코드의 묶음
- 어떤 목적을 가진 프로그램을 만들기 위해 관련된 변수, 함수, 클래스를 그룹핑한 것(모듈화, 패키징)
- 다양한 모듈들의 합, 폴더로 연결됨 > 물리적으로 디렉토리를 만드는 것
- __init__ , __main__ 등 키워드 파일명이 사용됨
- 다양한 오픈 소스들이 모두 패키지로 관리됨
> 기능을 나눠 폴더 생성
> 각 폴더별 필요한 모듈 구현
- 폴더별로 __init__.py 구성
- 현재 폴더가 패키지임을 알리는 초기화 스크립트
- 없을 경우 패키지로 간주하지 않지만 python3.3+부터는 해당사항 없음
> 낮은 버전을 사용할 수도 있으니 그래도 만듦 - 하위 폴더와 py 파일(모듈) 모두 포함
- import와 __all__ keyword 사용
- 실행파일인 __main__.py 파일 만들기
- 패키지 이름 만으로 호출 > __main__이 있어야 출력 가능
- 모듈 > 파이썬 실행 스크립트
> .py => top level에서 실행 > __name__ 스페셜 속성으로 모듈명 확인 가능
=> 이렇게 다른 모듈에서 import한 모듈이 실행되지 않도록 하려면
if __name__ == '__main__' :
실행코드
- Package namespace
- 모듈 호출의 범위 지정
- package 내에서 다른 폴더의 모듈을 부를 때 상대참조로 호출
- from game.graphic.render : 절대참조
- from .render : . 현재 디렉토리 기준
- from ..sound.echo : .. 부모 디렉토리 기준
- 오픈소스 라이브러리 사용
- 두 개의 프로젝트, 웹과 데이터 분석 패키지를 둘다 설치하면 가끔 충돌이 일어날 수 있음
> 가상환경 Virtual Environment 설정 - 프로젝트 진행 시 필요한 패키지만 설치하는 새로운 환경
- 기본 인터프리터 + 프로젝트 종류별 패키지 설치
- 다양한 패키지 관리 도구를 사용함
- 대표적으로 virtualenv + pip와 conda
conda create -n 가상환경명 python=파이썬버전
# 새로운 가상환경 설치
conda info --envs
# 설치된 가상환경 리스트 확인
activate 가상환경명
# 가상환경 활성화
deactivate
# 가상환경 비활성화
conda remove --name 가상환경명 --all
또는
conda remove -n 가상환경명 --all
# 가상환경 삭제
conda install 설치하고자_하는_패키지명
#패키지 설치
conda list
# 패키지 리스트 확인
conda clean --all
또는
conda clean -a
# conda 캐시 삭제
- matplotlib
: 대표적인 파이썬 그래프 관리 패키지
: 엑셀과 같이 그래프들을 화면에 표시 - tqdm
: 파일을 실행 등 남은 시간과 용량을 대략적으로 보여줌
* 내용참고&출처 : 태그의 수업을 복습 목적으로 정리한 내용입니다.
728x90