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]) : 입력받은 시퀀스 객체를 랜덤으로 섞음
#난수
>>> 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) #도움말

 

 

- 정규표현식 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 사용

__init__

  • 실행파일인 __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 + pipconda
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