오식랜드
[python] module 본문
module
모듈 만들기
ramdom모듈과 같이 외부 모듈을 가져다가 사용할 수도 있지만, 직접 만들 수도 있다!
영화표 가격을 계산해주는 모듈을 만들어보자
theater_module.py 라는 이름으로 파일을 하나 만들고 그 안에 함수를 만들어준다
이 파일에는 사람 수에 따른 영화표 가격을 계산해주는 3개 함수를 정의 할 것이다.
각 함수는 사람 수를 의미하는 people 을 전달받으며, 1인당 영화표 가격은 아래와 같이 계산한다.
- price() 함수에서는 일반 가격인 10,000원
- price_morning() 에서는 조조 할인 가격인 6,000원
- price_soldier() 에서는 군인 할인 가격인 4,000원
#일반 가격
def price(people):
print('{}명 가격은 {}원 입니다.'.format(people, people*10000))
#조조 가격
def price_morning(people):
print('{}명 가격은 {}원 입니다.'.format(people, people*6000))
#군인 가격
def price_soldier(people):
print('{}명 가격은 {}원 입니다.'.format(people, people*4000))
이제 이 파일은 모듈이 되며, 다른 파일에서 가져다 사용할 수 있다.
*모듈과 모듈을 사용할 파일은 같은 경로에 있어야한다!
모듈 사용하기
- import
모듈을 사용하는 방법에는 여러 가지가 있는데 가장 기본적인 import 를 먼저 보겠습니다.
import 구문을 쓸 때는 파일명 theater_module.py 에서 확장자 .py 를 제외한 모듈 이름 theater_module 을 그대로 적어주면 됩니다.
import 를 한 이후부터는 이 모듈에 정의한 함수를 사용할 수 있는데 모듈명 뒤에 점(.) 을 찍고 나서 함수 이름을 적습니다.
3개 함수를 각각 호출하며 전달값은 3, 4, 5 로 해보겠습니다.
import theater_module # theater_module 을 가져다가 사용
theater_module.price(3) # 3명이 영화 보러 갔을 때 가격
theater_module.price_morning(4) # 4명이 조조 영화 보러 갔을 때
theater_module.price_soldier(5) # 5명이 군인이 영화 보러 갔을 때
결과는 아래와 같습니다.
3명 가격은 30000원 입니다.
4명 조조 할인 가격은 24000원 입니다.
5명 군인 할인 가격은 20000원 입니다.
- import as
그런데 theater_module 이라는 이름이 다소 길어서 모듈을 사용할 때마다 불편하기도 합니다.
이럴 때는 as 를 이용해서 모듈에 별명을 붙여줄 수 있습니다.
영화는 영어로 movie 인데 이것도 길어 보이니 편의상 mv 라는 별명을 짓도록 하겠습니다.
import 구문 뒤에 as mv 를 붙여서 theater_module 이라는 이름을 이제는 mv 로 간편하게 호출할 수 있습니다
import theater_module as mv# theater_module 을 가져다가 mv라는 이름으로 사용
mv.price(3) # 3명이 영화 보러 갔을 때 가격
mv.price_morning(4) # 4명이 조조 영화 보러 갔을 때
mv.price_soldier(5) # 5명이 군인이 영화 보러 갔을 때
실행 결과는 동일합니다.
3명 가격은 30000원 입니다.
4명 조조 할인 가격은 24000원 입니다.
5명 군인 할인 가격은 20000원 입니다.
- from import
이번에는 from ~ import 구문을 써보겠습니다.
앞에서 이미 우리는 random 모듈을 사용할 때 이 구문을 연습해봤었는데요.
from random import *
from 뒤에 모듈 이름을 적고 그 모듈 내에서 가져다가 사용할 부분을 import 뒤에 적어주면 됩니다.
우선은 **모든 부분을 가져다 쓴다는 의미로 *** 을 적어보겠습니다.
from ~ import 구문을 통해 가져온 모듈은 모듈명과 점(.) 부분을 적어줄 필요 없이 모듈 내의 함수 이름을 그대로 적으면 됩니다.
from theater_module import * # theater_module 내에서 모든 것을 가져다가 사용
price(3) # theater_module. 필요 없음
price_morning(4)
price_soldier(5)
그런데 때로는 모듈 내에 정의된 모든 내용을 가져다 쓰지 않고 필요한 것만 가져다가 써야할 때도 있습니다.
예를 들어서 이미 군대를 전역한 사람이라면 군인 할인 가격에 해당하는 price_soldier() 함수는 아무런 쓸모가 없겠지요.
이 때는 from ~ import 구문 뒤에 * 대신 사용하고자 하는 부분만 콤마(,)로 구분하여 적으면 됩니다.
일반 가격인 price() 와 조조 할인 가격인 price_morning() 만 가져와보겠습니다.
이번에는 사람 수를 5, 6, 7 로 하여 3개 함수를 모두 호출해보겠습니다.
from theater_module import price, price_morning # 모듈에서 일부만 가져다가 사용
price(5) # 이번에는 5명
price_morning(6)
price_soldier(7) # import 하지 않았으므로 사용 불가
실행시켜보니 price() 와 price_morning() 은 정상적으로 결과가 출력되는데 price_soldier() 부분은 import 를 하지 않았으므로 정의되지 않은 이름이라고 하며 에러가 발생하는 것을 확인할 수 있습니다.
5명 가격은 50000원 입니다. 6명 조조 할인 가격은 36000원 입니다. Traceback (most recent call last): File "파일 경로", line 23, in <module> price_soldier(7)NameError: name 'price_soldier' is not defined
- from import as
마지막으로 from ~ import 구문에도 as 를 적용하여 별명을 지어주는 연습을 해보겠습니다.
from ~ import 구문에도 as 를 이용하여 별명을 지어줄 수 있습니다.
다음과 같이 코드를 작성하고 from ~ import 구문 뒤에 as price 를 적어주면 코드에서는 price() 라는 이름으로 모듈 내 함수에 접근할 수 있으며 이 때 실제로 호출되는 함수는 theater_module 내의 price() 가 아닌 price_solder() 가 됩니다.
from theater_module import price_soldier as price # price_soldier 를 새로운 별명인 price 로 사용
price(5) # price_soldier() 를 호출
실행 결과는 다음과 같습니다.
5명 군인 할인 가격은 20000원 입니다.
'dev-log > python' 카테고리의 다른 글
[python] module 직접 실행 (0) | 2023.01.12 |
---|---|
[python] package (0) | 2023.01.12 |
[python] class (0) | 2023.01.12 |
[python] 파일 입출력 (0) | 2023.01.09 |
[python] 입출력 (0) | 2023.01.09 |