시간 여행 목적지 계산기

PythonBeginner
지금 연습하기

소개

이 프로젝트에서는 Python 을 사용하여 시간 여행 목적지 계산기를 만드는 방법을 배우게 됩니다. 이 계산기는 현재 날짜와 우주선이 여행할 수 있는 예상 일수를 기반으로 시간 여행 우주선이 도달할 수 있는 최대 과거 및 미래 날짜를 결정하는 데 도움이 됩니다.

👀 미리보기

## Input:

## Output:

🎯 과제

이 프로젝트에서는 다음을 배우게 됩니다.

  • 주어진 문자열에서 날짜 정보를 추출하는 방법
  • 주어진 일수를 기준으로 과거 및 미래 날짜를 계산하는 방법
  • 계산된 날짜의 형식을 지정하고 문자열 목록으로 반환하는 방법

🏆 성과

이 프로젝트를 완료하면 다음을 수행할 수 있습니다.

  • Python 에서 날짜 및 timedelta (시간 간격) 를 사용하는 방법을 이해합니다.
  • 시간 여행 목적지를 계산하는 함수를 구현합니다.
  • 코드에서 예외 및 엣지 케이스 (edge case) 를 처리합니다.
  • 깨끗하고 유지 관리 가능한 Python 코드를 작성합니다.

날짜 정보 추출

이 단계에서는 입력 시간 문자열에서 연도, 월, 및 일을 추출하는 방법을 배우게 됩니다.

  1. 선호하는 코드 편집기에서 time_travel_destination.py 파일을 엽니다.
  2. time_travel_destination(time: str, days: int) 함수를 찾습니다.
  3. 함수 내에서 다음 코드를 추가하여 time 매개변수에서 연도, 월, 및 일을 추출합니다.
try:
    ## Extract year, month, and day from the time string
    year, month, day = map(int, time.split("-"))
## except (ValueError, OverflowError):
##     ## If a ValueError or OverflowError occurs, return an empty list
##     return []

이 줄은 map() 함수와 split() 메서드를 사용하여 time 문자열을 연도, 월, 및 일을 나타내는 정수 목록으로 변환합니다.

  1. 다음으로, 추출된 날짜가 유효한지 확인해야 합니다. datetime.date() 함수를 사용하여 이를 수행할 수 있습니다.
## Extract year, month, and day from the time string
year, month, day = map(int, time.split("-"))
## Check if the date is valid
datetime.date(year, month, day)

날짜가 유효하면 이 줄은 예외를 발생시키지 않습니다. 날짜가 유효하지 않으면 ValueError가 발생합니다.

✨ 솔루션 확인 및 연습

과거 및 미래 날짜 계산

이 단계에서는 주어진 일수를 기준으로 과거 및 미래 날짜를 계산하는 방법을 배우게 됩니다.

  1. time_travel_destination(time: str, days: int) 함수 내에서 과거 및 미래 날짜를 계산하기 위해 다음 코드를 추가합니다.
try:
    past_time = datetime.date(year, month, day) - datetime.timedelta(days=days)
except OverflowError:
    past_time = datetime.date(1, 1, 1)
future_time = datetime.date(year, month, day) + datetime.timedelta(days=days)

past_time 변수는 원래 날짜에서 days 매개변수를 빼서 계산됩니다. 그러나 결과 날짜가 표현 가능한 최소 날짜 (서기 1 년 1 월 1 일) 이전인 경우 OverflowError가 발생합니다. 이 경우 past_time을 표현 가능한 최소 날짜로 설정합니다.

future_time 변수는 원래 날짜에 days 매개변수를 더하여 계산됩니다.

✨ 솔루션 확인 및 연습

결과 형식 지정 및 반환

이 단계에서는 과거 및 미래 날짜의 형식을 지정하고 문자열 목록으로 반환하는 방법을 배우게 됩니다.

  1. time_travel_destination(time: str, days: int) 함수 내에서 과거 및 미래 날짜의 형식을 지정하고 목록으로 반환하기 위해 다음 코드를 추가합니다.
return [past_time.strftime("%d-%m-%Y"), future_time.strftime("%d-%m-%Y")]

strftime() 메서드는 past_timefuture_time datetime.date 객체를 "dd-mm-yyyy" 형식의 문자열로 형식화하는 데 사용됩니다.

  1. 마지막으로, 함수 실행 중에 발생할 수 있는 ValueError 또는 OverflowError 예외를 catch 하기 위해 예외 처리 블록을 추가합니다.
except (ValueError, OverflowError):
    return []

이러한 예외가 발생하면 함수는 빈 목록을 반환합니다.

최종 time_travel_destination(time: str, days: int) 함수는 다음과 같아야 합니다.

import datetime

def time_travel_destination(time: str, days: int):
    try:
        ## Extract year, month, and day from the time string
        year, month, day = map(int, time.split("-"))
        ## Check if the date is valid
        datetime.date(year, month, day)
        try:
            ## Subtract the specified number of days from the given date
            past_time = datetime.date(year, month, day) - datetime.timedelta(days=days)
        except OverflowError:
            ## If an OverflowError occurs, set past_time to the minimum representable date
            past_time = datetime.date(1, 1, 1)
        ## Add the specified number of days to the given date
        future_time = datetime.date(year, month, day) + datetime.timedelta(days=days)
        ## Return the past and future dates in the format 'dd-mm-yyyy'
        return [past_time.strftime("%d-%m-%Y"), future_time.strftime("%d-%m-%Y")]
    except (ValueError, OverflowError):
        ## If a ValueError or OverflowError occurs, return an empty list
        return []

이제 time_travel_destination(time: str, days: int) 함수의 구현을 완료했습니다. time_travel_destination.py 파일의 main 블록에서 제공된 예제를 실행하여 함수를 테스트할 수 있습니다. 몇 가지 예제가 아래에 제공됩니다.

  • 입력:
print(time_travel_destination('2238-2-11', 30))
print(time_travel_destination('2238-2-11', 0))
print(time_travel_destination('2238-2-11', 100))
  • 출력:
['12-01-2238', '13-03-2238']
['11-02-2238', '11-02-2238']
['03-11-2237', '22-05-2238']
✨ 솔루션 확인 및 연습

요약

축하합니다! 이 프로젝트를 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 기술을 향상시킬 수 있습니다.