모듈
<calculator.py>
# 더하기
def add(x, y):
return x + y
# 빼기
def subtract(x, y):
return x - y
# 곱하기
def multiply(x, y):
return x * y
# 나누기
def divide(x, y):
return x / y
이 함수들을 활용해서 프로그램을 만들려고 한다. 그러면 코드 맨 밑으로 가서, 이 함수들을 사용하면 된다.
그런데 이렇게 한 파일에 함수도 다 정의하고, 우리가 실제 실행하려는 코드도 다 쓰다 보면 하나의 파일이 너무 길어질 수도 있다. 그래서 코드를 여러 파일로 분리해서 사용하기도 한다.
<run.py>
import calculator
이것은 calculator라는 파이썬 파일을 불러와서 사용하겠다는 의미이다.
이때 calculator.py파일을 '모듈'이라고 한다. 다른 파이썬 프로그램에서 사용할 수 있는 파이썬 코드를 '모듈'이라고 하는 것이다.
여기서 주의해야 할 점이 하나 있다. 현재 이 run.py파일이랑 같은 폴더에 있는 파이썬 파일만 불러올 수 있다는 것이다.
지금 같은 경우에는 run.py랑 우리가 불러오려는 calculator.py랑 같은 폴더에 있기 때문에 이렇게 불러올 수 있는 것이다.
다른 폴더에 있는 모듈도 사실 불러올 수 있긴 하지만 이번 토픽에서는 다루지 않도록 하겠다.
아무튼 그러면 이제 calculator 파일에 있는 함수들을 사용할 수 있다.
import calculator
print(calculator.add(2,5))
print(calculator.multiply(3, 4))
7
12
import calculator as calc
print(calc.add(2, 5))
print(calc.multiply(3, 4))
모듈명이 길 경우 이렇게 마음대로 줄여서 사용할 수도 있다.
from calculator import add, multiply
print(add(2, 5))
print(multiply(3, 4))
이것은 calculator라는 모듈에서 add함수와 multiply함수만 불러오겠다는 의미이다. 그러면 이 프로그램에서 add함수와 multiply함수를 쓸 수 있는 것인데, 이제는 앞에 붙어 있는 이 모듈 이름을 쓸 필요가 없다.
마치 이 파일 내에서 정의한 함수인 것처럼 사용할 수 있는 것이다.
from calculator import *
하나씩 불러오는 게 귀찮으면 한꺼번에 불러올 수 있는데, 함수들 대신 별표(*)를 쓰면 된다.
그러나 이 방식을 사용하면 함수들의 출처가 좀 불분명해지므로 파이썬 커뮤니티에서도 권장하지 않는 방법이다.
스탠다드 라이브러리
import math
print(math.log10(100))
print(math.cos(0))
print(math.pi)
2.0
1.0
3.141592653589793
import random
pritn(random.random()) # 0.0과 1.0 사이의 랜덤한 수가 리턴됨
import os
print(os.getlogin()) # 현재 컴퓨터에 어떤 계정으로 로그인 되어 있는지 알 수 있음
print(os.getcwd()) # 현재 이 파일이 있는 폴더의 경로를 받아 옴
os는 operating system, 한국말로는 '운영체제'의 약자이다. 이 os 모듈은 파이썬으로 우리의 운영체제를 조작하기 위한 것이다.
random 모듈
import random
스탠다드 라이브러리에 있는 random 모듈은 랜덤한 숫자를 생성하기 위한 다양한 함수들을 제공해 줍니다.
randint 함수
randint는 두 수 사이의 어떤 랜덤한 정수를 리턴하는 함수입니다.
randint(a, b)를 하면, a ≤ N ≤ b를 만족하는 어떤 랜덤한 정수 N을 리턴하는 것이죠.
import random
print(random.randint(1, 20))
print(random.randint(1, 20))
print(random.randint(1, 20))
print(random.randint(1, 20))
print(random.randint(1, 20))
8
3
6
6
2
1 이상, 20 이하의 수 다섯 개를 출력했는데요. 보시다시피 매번 다른 랜덤한 수가 출력되었습니다. 여러분이 실행하시면 아마 또 다른 결과가 나오겠죠?
uniform 함수
uniform은 두 수 사이의 랜덤한 소수를 리턴하는 함수입니다. randint와 다른 것은 리턴하는 값이 정수가 아니라 소수라는 점입니다.
uniform(a, b)를 하면, a ≤ N ≤ b를 만족하는 어떤 랜덤한 소수 N을 리턴하는 것이죠.
import random
print(random.uniform(0, 1))
print(random.uniform(0, 1))
print(random.uniform(0, 1))
print(random.uniform(0, 1))
print(random.uniform(0, 1))
0.08811632754196952
0.599056286966887
0.03005761564442677
0.45302183459579204
0.5120418463594933
0 이상, 1 이하의 수 다섯 개를 출력했는데요. 보시다시피 매번 다른 랜덤한 수가 출력되었습니다. 여러분이 실행하시면 아마 또 다른 결과가 나오겠죠?
datetime 모듈
import datetime
스탠다드 라이브러리에 있는 datetime 모듈은 '날짜'와 '시간'을 다루기 위한 다양한 '클래스'를 갖추고 있습니다. '클래스' 개념은 아직 배우지 않았지만, 일단은 몰라도 이 모듈을 사용하는 데에는 문제 없습니다.
datetime 값 생성
2020년 3월 14일을 파이썬으로 어떻게 표현할 수 있을까요? 이렇게 하면 됩니다.
pi_day = datetime.datetime(2020, 3, 14)
print(pi_day)
print(type(pi_day))
2020-03-14 00:00:00
<class 'datetime.datetime'>
보시다시피 시간은 자동으로 00시 00분 00초로 설정되었는데요. 우리가 시간까지도 직접 정할 수 있습니다.
pi_day = datetime.datetime(2020, 3, 14, 13, 6, 15)
print(pi_day)
print(type(pi_day))
2020-03-14 13:06:15
<class 'datetime.datetime'>
오늘날짜
우리가 날짜와 시간을 정해 주는 게 아니라, 코드를 실행한 '지금 이 순간'의 날짜와 시간을 받아 오고 싶다면? 이렇게 하면 됩니다.
today = datetime.datetime.now()
print(today)
print(type(today))
2020-04-05 17:49:12.360266
<class 'datetime.datetime'>
timedelta
두 datetime 값 사이의 기간을 알고 싶으면, 마치 숫자 뺄셈을 하듯이 그냥 빼면 됩니다.
today = datetime.datetime.now()
pi_day = datetime.datetime(2020, 3, 14, 13, 6, 15)
print(today - pi_day)
print(type(today - pi_day))
22 days, 4:42:57.360266
<class 'datetime.timedelta'>
보시다시피 두 datetime 값을 빼면, timedelta라는 타입이 나오는데요. 이건 날짜 간의 차이를 나타내는 타입이라고 생각하시면 됩니다.
반대로 timedelta를 생성해서 datetime 값에 더해 줄 수도 있습니다.
today = datetime.datetime.now()
my_timedelta = datetime.timedelta(days=5, hours=3, minutes=10, seconds=50)
print(today)
print(today + my_timedelta)
2020-04-05 17:54:24.221660
2020-04-10 21:05:14.221660
datetime 해부하기
datetime 값에서 '연도'나 '월' 같은 값들을 추출하려면 어떻게 해야 할까요?
아주 간단합니다!
today = datetime.datetime.now()
print(today)
print(today.year) # 연도
print(today.month) # 월
print(today.day) # 일
print(today.hour) # 시
print(today.minute) # 분
print(today.second) # 초
print(today.microsecond) # 마이크로초
2020-04-05 17:59:21.709817
2020
4
5
17
59
21
709817
datetime 포맷팅
datetime 값을 출력하면 별로 예쁘지 않습니다. 하지만 strftime을 사용하면, 우리 입맛대로 바꿀 수 있습니다.
today = datetime.datetime.now()
print(today)
print(today.strftime("%A, %B %dth %Y"))
2020-04-05 18:09:55.233501
Sunday, April 05th 2020
%A, %B, %d, %Y와 같은 걸 포맷 코드라고 하는데요. 어떤 포맷 코드를 사용할지는 아래 표를 참고해 주세요.
포맷 | 코드설명 | 예시 |
%a | 요일 (짧은 버전) | Mon |
%A | 요일 (풀 버전) | Monday |
%w | 요일 (숫자 버전, 0~6, 0이 일요일) | 5 |
%d | 일 (01~31) | 23 |
%b | 월 (짧은 버전) | Nov |
%B | 월 (풀 버전) | November |
%m | 월 (숫자 버전, 01~12) | 10 |
%y | 연도 (짧은 버전) | 16 |
%Y | 연도 (풀 버전) | 2016 |
%H | 시간 (00~23) | 14 |
%I | 시간 (00~12) | 10 |
%p | AM/PM | AM |
%M | 분 (00~59) | 34 |
%S | 초 (00~59) | 12 |
%f | 마이크로초 (000000~999999) | 413215 |
%Z | 표준시간대 | PST |
%j | 1년 중 며칠째인지 (001~366) | 162 |
%U | 1년 중 몇 주째인지 (00~53, 일요일이 한 주의 시작이라고 가정) | 35 |
%W | 1년 중 몇 주째인지 (00~53, 월요일이 한 주의 시작이라고 가정) | 35 |
input
name = input("이름을 입력하세요: ")
print(name)
이름을 입력하세요: Codeit
Codeit
우리가 Codeit을 입력하고 엔터를 치면, 이 input함수의 리턴값으로 문자열 Codeit이 돌아오게 된다.
그러니까 input("이름을 입력하세요: ") 이 부분이 문자열 Codeit으로 대체된다. 그러면 문자열 Codeit이 변수 name에 저장되고 그래서 print(name)을 하니까 Codeit이 출력되는 것이다.
x = input("숫자를 입력하세요: ")
print(x + 5)
input 함수가 받는 사용자 입력은 항상 문자열이다. 그래서 문자열과 정수를 더하려고 하면 오류가 나온다.
즉 이것을 해결하기 위해서는 input의 리턴값을 정수형으로 변환해야 한다.
x = int(input("숫자를 입력하세요: "))
print(x + 5)
숫자를 입력하세요: 7
12
실습과제: 숫자 맞히기 게임
1과 20 사이의 숫자를 맞히는 게임을 만들려고 합니다. random 모듈과 input 함수를 활용하여 프로그램을 만들어 보세요.
진행 방식
- 프로그램을 실행하면 "기회가 *번 남았습니다. 1-20 사이의 숫자를 맞혀 보세요: "가 출력됩니다. 총 네 번의 기회가 주어지며, 사용자가 한 번 추측할 때마다 남은 기회 횟수가 줄어듭니다.
- 정답을 맞히면 "축하합니다. *번 만에 숫자를 맞히셨습니다."가 출력되고 프로그램은 종료됩니다.
- 사용자가 입력한 수가 정답보다 작은 경우 "Up"이 출력되고, 입력한 수가 정답보다 큰 경우 "Down"이 출력됩니다.
- 정답이 틀렸으면 1번부터 다시 진행합니다. 만약 네 번의 기회를 모두 사용했는데도 답을 맞히지 못했으면, "아쉽습니다. 정답은 *입니다."가 출력되고 프로그램은 종료됩니다.
시뮬레이션 #1
기회가 4번 남았습니다. 1-20 사이의 숫자를 맞혀보세요: 10
Up
기회가 3번 남았습니다. 1-20 사이의 숫자를 맞혀보세요: 15
Up
기회가 2번 남았습니다. 1-20 사이의 숫자를 맞혀보세요: 17
축하합니다. 3번만에 숫자를 맞히셨습니다.
시뮬레이션 #2
기회가 4번 남았습니다. 1-20 사이의 숫자를 맞혀보세요: 19
Down
기회가 3번 남았습니다. 1-20 사이의 숫자를 맞혀보세요: 14
Down
기회가 2번 남았습니다. 1-20 사이의 숫자를 맞혀보세요: 6
Up
기회가 1번 남았습니다. 1-20 사이의 숫자를 맞혀보세요: 10
UP
아쉽습니다. 정답은 12였습니다.
'~2023.02 > Python' 카테고리의 다른 글
프로그래밍 기초 in Python _ [토픽3] 프로그래밍과 데이터 in Python _ 사전 & 파이썬 데이터의 비밀 (0) | 2021.09.05 |
---|---|
프로그래밍 기초 in Python _ [토픽3] 프로그래밍과 데이터 in Python _ 리스트 & for 반복문 (0) | 2021.09.04 |
프로그래밍 기초 in Python _ [토픽2] 프로그래밍 핵심 개념 in Python _ 제어문 (0) | 2021.09.03 |
프로그래밍 기초 in Python _ [토픽2] 프로그래밍 핵심 개념 in Python _ 추상화 (0) | 2021.09.03 |
프로그래밍 기초 in Python _ [토픽2] 프로그래밍 핵심 개념 in Python _ 자료형 (0) | 2021.09.03 |