[PYTHON] RANDOM 모듈, DATETIME  모듈, INPUT함수(과제 : 숫자맞추기 게임)

2020. 12. 26. 06:46IT/PYTHON

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))

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 이상, 1 이하의 수 다섯 개를 출력했는데요. 보시다시피 매번 다른 랜덤한 수가 출력되었습니다. 여러분이 실행하시면 아마 또 다른 결과가 나오겠죠?

 

DATETIME모듈

import datetime

스탠다드 라이브러리에 있는 datetime 모듈은 '날짜'와 '시간'을 다루기 위한 다양한 '클래스'를 갖추고 있습니다. '클래스' 개념은 아직 배우지 않았지만, 일단은 몰라도 이 모듈을 사용하는 데에는 문제 없습니다. 

datetime 값 생성

2020년 3월 14일을 파이썬으로 어떻게 표현할 수 있을까요? 이렇게 하면 됩니다.

pi_day = datetime.datetime(2020, 3, 14)
print(pi_day)
print(type(pi_day))

보시다시피 시간은 자동으로 00시 00분 00초로 설정되었는데요. 우리가 시간까지도 직접 정할 수 있습니다.

pi_day = datetime.datetime(2020, 3, 14, 13, 6, 15) print(pi_day) print(type(pi_day))

 

오늘 날짜

우리가 날짜와 시간을 정해 주는 게 아니라, 코드를 실행한 '지금 이 순간'의 날짜와 시간을 받아 오고 싶다면? 이렇게 하면 됩니다.

today = datetime.datetime.now()
print(today)
print(type(today))

 

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))

보시다시피 두 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)

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)  # 마이크로초

 

datetime 포맷팅 

datetime 값을 출력하면 별로 예쁘지 않습니다. 하지만 strftime을 사용하면, 우리 입맛대로 바꿀 수 있습니다.

today = datetime.datetime.now()

print(today)
print(today.strftime("%A, %B %dth %Y"))

%A, %B, %d, %Y와 같은 걸 포맷 코드라고 하는데요. 어떤 포맷 코드를 사용할지는 아래 표를 참고해 주세요. 

 

Q1. 1과 20 사이의 숫자를 맞히는 게임을 만들려고 합니다. random 모듈과 input 함수를 활용하여 프로그램을 만들어 보세요. 

진행 방식 

1. 프로그램을 실행하면 "기회가 *번 남았습니다. 1-20 사이의 숫자를 맞혀 보세요: "가 출력됩니다. 총 네 번의 기회가 주어지며, 사용자가 한 번 추측할 때마다 남은 기회 횟수가 줄어듭니다. 

2. 정답을 맞히면 "축하합니다. *번 만에 숫자를 맞히셨습니다."가 출력되고 프로그램은 종료됩니다. 

3. 사용자가 입력한 수가 정답보다 작은 경우 "Up"이 출력되고, 입력한 수가 정답보다 큰 경우 "Down"이 출력됩니다. 

4. 정답이 틀렸으면 1번부터 다시 진행합니다. 만약 네 번의 기회를 모두 사용했는데도 답을 맞히지 못했으면, "아쉽습니다. 정답은 *입니다."가 출력되고 프로그램은 종료됩니다.

# 내 답안
import random

# 코드를 작성하세요.
chance = 4
answer = random.randint(1, 20)
cnt = 1


while chance > 0:
    print(f"기회가 {chance}번 남았습니다. 1-20 사이의 숫자를 맞혀 보세요 : ")
    input_string = input()
    input_int = int(input_string)
    
    if answer == input_int:
        print(f"축하합니다.{cnt}번 만에 숫자를 맞히셨습니다.}")
        break
    elif answer > input_int:
        print("Up")
    elif answer < input_int:
        print("Down")
        
    chance = chance - 1
    cnt = cnt + 1

if chance == 0:
    print(f"아쉽습니다. 정답은 {answer}였습니다.")


# 모범 답안
import random

# 상수 정의
ANSWER = random.randint(1, 20)
NUM_TRIES = 4

# 변수 정의
guess = -1
tries = 0

while guess != ANSWER and tries < NUM_TRIES:
    guess = int(input("기회가 {}번 남았습니다. 1-20 사이의 숫자를 맞혀보세요: ".format(NUM_TRIES - tries)))
    tries += 1    
    
    if ANSWER > guess:
        print("Up")
    elif ANSWER < guess:
        print("Down")

if guess == ANSWER:
    print("축하합니다. {}번 만에 숫자를 맞히셨습니다.".format(tries))
else:
    print("아쉽습니다. 정답은 {}입니다.".format(ANSWER))