모듈(Module)

타키탸키·2021년 1월 22일
0

Python 입문하기

목록 보기
11/14
post-thumbnail

지금까지 Python을 활용해서 간단한 연산이나 응용을 배워봤습니다. 이번 챕터부터는 좀 더 난이도를 높여 Python을 통해 간단한 데이터 분석과 단어장과 같은 프로그램을 만들어봅시다. 그 전에 Python을 다양한 상황에 응용할 수 있도록 돕는 모듈이라는 개념에 대해 함께 알아볼까요?

🔨 모듈

오랜만에 Pycharm을 열고 calculator라는 파일을 생성한 후, 다음 코드를 작성해봅시다.

# 덧셈
def add(a, b):
    return a + b
    
# 뺄셈
def subtract(a, b):
    return a - b
    
# 곱셈
def multiply(a, b):
    return a * b
    
# 나눗셈
def divide(a, b):
    return a / b

위 코드에는 사칙연산 함수들이 나열되어 있습니다. 이제 이 함수들을 활용하여 하나의 프로그램을 만드려고 합니다.

그런데 이렇게 여러 번 함수를 정의하고 그 함수마다 코드를 입력하다 보면 하나의 파일이 너무 길어질 수 있습니다. 이를 방지하기 위해 코드를 여러 파일로 분리해서 사용하곤 하는데요.

우선, 새로운 파일을 열고 파일 이름을 정해줍시다. 그 다음, 에디터에 다음 코드를 작성해보세요.

import calculator

이 코드가 의미하는 것은 calculator라는 Python 파일을 불러오겠다는 의미입니다. 이때, calculator.py 파일을 모듈이라고 부릅니다. 다시 말해, 다른 Python 프로그램에서 사용할 수 있는 Python 코드가 바로 모듈입니다.

주의할 것은 파일을 불러올 때에는 같은 폴더에 있는 경우에만 가능하다는 점인데요. 지금 같은 경우, calculator와 새로 만든 파일이 같은 폴더에 있기 때문에 불러올 수 있는 것입니다. 엄밀히 따지면 다른 폴더에 있는 파일도 불러올 수 있지만 이번 챕터에서는 다루지 않겠습니다.

이제 모듈을 불러낸 새로운 파일에서 calculator에 정의한 함수들을 사용할 수 있습니다. 다음과 같이 하면 말이죠.

import calculator

print(calculator.subtract(3, 1))
2

subtract는 두 정수를 파라미터로 받고 그 뺄셈을 리턴하는 함수입니다. 다른 파일에서 정의된 함수를 쓸 때는 파일명(모듈명)을 적고 점을 찍은 뒤 그 파일에서 정의된 함수를 호출하면 됩니다.

그런데 불러올 때마다 calculator라는 긴 이름을 작성하기가 번거롭습니다. 이때, 모듈명을 간단히 변경할 수 있는데요. 다음 코드를 봅시다.

import calculator as calc

이렇게 as를 통해 원하는 이름으로 변경이 가능합니다. 지금부터는 calc.함수로 작성해도 calculator의 함수를 호출할 수 있습니다.

원하는 이름으로 변경은 가능하지만 항상 협업 가능성을 염두에 두고 다른 사람들도 쉽게 알아볼 수 있는 형태로 별명을 지정하는 것이 좋겠죠?

대표적인 사례로는 Python에서 데이터 분석에 사용되는 모듈인 numpy와 pandas의 약어인데요. 이들은 각각 np와 pd로 별명을 붙이곤 합니다.

마지막으로 간소화된 모듈명조차 반복해서 적기가 번거롭다면 다음과 같은 코드를 활용하면 됩니다.

from calculator import subtract, divide

print(subtract(3, 1))
print(divide(3, 1))

이렇게 from 뒤에는 모듈명을 import 뒤에는 사용할 함수 이름들을 나열하면 코드 내에서 모듈명을 작성할 필요가 없습니다. 마치 해당 파일 내에서 정의한 함수인 것처럼 사용할 수 있는 것이죠.

만약 추가로 add 함수를 사용하고 싶다면 import 뒤에 add를 먼저 적어줘야 합니다. 그런데 일일히 적어주기가 또 번거롭죠? 그럴 때는 import 뒤에 간단히 별표(*)만 적으면 됩니다. 별표의 의미는 전체를 불러온다는 뜻입니다.

from calculator import *

print(subtract(3, 1))
print(divide(3, 1))

이제 위 코드로는 calculator의 모든 함수를 불러올 수 있습니다. 그러나 커뮤니티에서는 별표의 사용을 지양하라고 권하는데요. 별표를 사용하게 되면 출처가 불분명해지기 때문입니다.

따라서, 별표를 사용하기보다는 앞서 소개해드린 필요한 함수들만 나열하기 혹은 별명을 붙여 코드 간소화하기 방법을 사용하는 것을 더 추천 드립니다.

다시 한 번 정의하자면, 모듈기능들을 정의해둔 Python 프로그램이라고 할 수 있습니다. 모듈이 필요한 이유는 정의된 기능들을 불러와서 사용하기 위해서이죠. 모듈을 사용할 때는 import라는 문법이 필요합니다.

🔨 스탠다드 라이브러리(Standard Library)

사실 개발자들이 자주 쓰는 대부분의 기능들은 이미 만들어져 있습니다. Python을 설치하면 스탠다드 라이브러리, 한국어로는 표준 라이브러리라는 것이 함께 딸려오는데요. 바로 이 스탠다드 라이브러리 내에 다양한 모듈들이 있고 그 모듈들 안에 우리가 필요한 기능들이 들어있는 거죠.

이번 챕터에서 우리는 스탠다드 라이브러리 속 몇 가지 모듈을 살펴볼 겁니다.

❗ math

먼저 math라는 모듈을 봅시다. 앞서 소개했듯 math는 직접 만든 모듈이 아닌 스탠다드 라이브러리에 기본으로 있는 모듈입니다.

이름만 봐도 알 수 있듯이 math는 수학과 관련된 기능들이 모여있습니다. 참고로 한 번 훑어보는 것이기 때문에 모르는 수학 용어가 나와도 상관 없이 그냥 보기만 하면 됩니다.

math를 통해 로그(log) 연산과 코사인(cos) 연산을 해봅시다.

import math

print(math.log2(4))
print(math.cos(0))
2.0
1.0

이렇게 math 모듈에서 로그 함수를 가져다 쓰기만 하면 됩니다. math 안에는 함수 말고도 다른 기능을 불러올 수 있는데요.

import math

print(math.pi)
3.141592653589793

위 코드는 함수가 아닌 원주율 pi를 가져옵니다.

❗ random

다음으로 random이라는 모듈을 불러오겠습니다. 이 모듈은 임의의 한 값을 만들어내고 싶을 때 사용합니다.

import random

print(random.random())
0.4564891635489

다음과 같이 모듈과 동일한 이름의 random 함수를 호출하면 0.0과 1.0 사이의 임의의 한 수가 리턴됩니다. 실행할 때마다 각각 다른 값이 나옵니다.

random의 다른 함수들도 함께 볼까요?

randit 함수

randit은 두 수 사이의 임의의 정수를 리턴해주는 함수입니다. randit(x, y)를 하면, x<=n<=b를 만족하는 임의의 정수 n을 리턴합니다.

import random

print(random.randint(1, 10))
print(random.randint(1, 10))
print(random.randint(1, 10))
9
3
6

uniform 함수

uniform 함수는 randint 함수와 마찬가지로 두 수 사이의 임의의 수를 리턴해줍니다. 사용법도 동일하죠. randint와의 차이는 정수가 아닌 소수를 리턴한다는 점입니다.

import random

print(random.uniform(1, 10))
print(random.uniform(1, 10))
print(random.uniform(1, 10))
1.2111405668842958
7.3344831292024955
1.6934688886339444

❗ datetime

datetime 모듈은 날짜와 시간을 다루기 위한 다양한 '클래스'를 가지고 있습니다. 여기서 우리는 '클래스'라는 용어를 아직 배우지 않았지만 그럼에도 이 모듈을 사용하는 데에는 문제가 없습니다.

datetime 값 생성

2021년 1월 22일을 Python으로 어떻게 표현할 수 있을까요?

import datetime

p_day = datetime.datetime(2021, 1, 22)
print(p_day)
print(type(p_day))
2021-01-22 00:00:00
<class 'datetime.datetime'>

위 코드의 결괏값을 보면 날짜는 성공적으로 생성했지만 시간이 자동으로 00시 00분 00초로 설정되어 있습니다. 그렇다면 시간을 설정하기 위해서는 어떻게 해야할까요?

import datetime

p_day = datetime.datetime(2021, 1, 22, 15, 2, 30)
print(p_day)
print(type(p_day))
2021-01-22 15:02:30
<class 'datetime.datetime'>

datetime의 파라미터를 세 개 더 늘리면 시, 분, 초를 설정할 수 있습니다.

오늘 날짜

그렇다면 날짜와 시간을 직접 설정하는 것이 아닌 현재 날짜와 시간을 불러오려면 어떻게 해야할까요?

import datetime

today = datetime.datetime.now()
print(today)
print(type(today))
2021-01-22 15:07:20.086792
<class 'datetime.datetime'>

today라는 변수에 datetime의 now라는 메소드를 통해 나온 현재 날짜와 시간을 저장한 후 출력하면 됩니다.

timedelta

두 datetime값 사이의 기간을 알고 싶으면, 뺄셈을 활용할 수 있습니다.

import datetime

today = datetime.datetime.now()
p_day = datetime.datetime(2021, 3, 6, 9, 30, 30)
print(today - p_day)
print(type(today - p_day))
-43 days, 5:39:54.987744
<class 'datetime.timedelta'>

결과값을 보면 timedelta라는 타입을 가지는데요. 이는 날짜 간의 차이를 나타내는 타입을 의미합니다.

이와 반대로, timedelta를 통해 datetime 값을 더할 수도 있습니다.

import datetime

today = datetime.datetime.now()
p_timedelta = datetime.timedelta(days=1, hours=2, minutes=30, seconds=40)

print(today)
print(type(today + p_timedelta))
2021-01-22 15:13:51.938912
<class 'datetime.datetime'>

datetime 해부하기

datetime 값에서 연도와 월과 같이 날짜와 관련된 항목들과 시, 분, 초와 같은 시간과 관련된 항목들을 추출하려면 어떻게 해야 할까요?

import datetime

today = datetime.datetime.now()

print(today.year)
print(today.month)
print(today.day)
print(today.hour)
print(today.minute)
print(today.second)
print(today.microsecond)
print(today)
2021
1
22
15
17
5
183094
2021-01-22 15:17:05.183094

날짜와 시간과 관련된 함수명들은 매우 직관적이므로 알고 싶은 데이터에 대한 함수명을 그대로 적으면 됩니다.

datetime 포맷팅

datetime값은 그대로 출력하면 조금 지저분합니다. 우리가 원하는 형태로 datetime값을 바꾸어 출력이 가능한데요. 다음 코드를 볼까요?

import datetime

today = datetime.datetime.now()

print(today)
print(today.strftime("%A, %B %dth %Y"))
2021-01-22 15:21:13.827274
Friday, January 22th 2021

여기서 strftime은 'string from time'의 약어이고, '%A, %B %dth %Y'와 같은 항목들을 포맷 코드라고 합니다. 어떤 포맷 코드를 사용해야 할 지는 아래 표를 참고해보세요.

❗ os

마지막으로 os라는 모듈을 한 번 봅시다. 이전 챕터에서 배웠듯이 os는 operating system(운영체제)의 줄임말입니다. 이 os 모듈은 Python으로 운영체제를 조작하기 위한 기능을 담고 있습니다.

import os

print(os.getlogin())
print(os.getcwd())
LYS
C:\Users\LYS\PycharmProjects\CodeitPython\venv

예를 들어, getlogin 함수는 현재 컴퓨터에 어떤 계정으로 로그인 되어 있는지를 보여줍니다. 그리고 getcwd 함수는 현재 파일이 있는 폴더의 경로를 받아옵니다.


이번 시간에는 여러 기능을 담고 있는 Python 파일인 모듈의 사용법과 유용한 모듈이 담긴 스탠다드 라이브러리의 여러 사례를 함께 살펴봤습니다. 이들 개념은 Python에서 하나의 프로그램을 생성하기 위해 꼭 익혀야 할 항목들입니다. 다음 시간에는 모듈을 활용하는 다른 방법들을 추가적으로 배워보겠습니다.

* 이 자료는 CODEIT의 '프로그래밍 기초 in Python'을 기반으로 작성되었습니다.
profile
There's Only One Thing To Do: Learn All We Can

0개의 댓글