윤년 판별 함수

출처 : 윤년 - 나무위키
def isLeapYear(year): # 윤년이면 True, 아니면 False 를 출력하는 함수.
    return year % 4 == 0 and year % 100 != 0 or year % 400 == 0

#잘 작동하는지 확인

calendar 모듈을 이용하면 함수를 따로 생성하지 않고 가능하다.

마지막 날짜 계산

마지막 날짜가 월별로 다르고 윤년일때는 2월의 마지막 날짜가 또 달라집니다.

def lastDay(yearmonth):
    # 각 달의 마지막 날짜를 기억하는 리스트 만들기
    m = [312831303130313130313031]
   
    # 2월의 마지막 날짜를 확정 => 윤년이면 29일로 수정
    if isLeapYear(year):
        m[1] = 29 

    return m[month - 1]  # 마지막 날짜 리턴

윤년일 때는 m[1] 즉, 2월의 마지막 날짜가 수정됨 . 

마지막 날짜를 반환하는 함수 생성

지나온 날짜 계산

 

totalDay 년, 월, 일을 넘겨받아 1년 1월 1일 부터 지난 날짜의 합계를 리턴하는 함수

 

total 계산 순서

  1. 평년을 기준으로 전년도까지 일자 합계 -> 윤년이었던 횟수 더하기
  2. 전달까지 해당 연도 일자 더하기
  3. 이번달 날짜 더하기
def totalDay(yearmonthday):
    # 1년 1월 1일 부터 전 년도 12월 31일 까지 지난 날짜를 합산
    total = (year - 1) * 365 + (year - 1) // 4 - (year - 1) // 100 + (year - 1) // 400
    
    # 전년도 까지 지난 날짜의 합계에 전 달까지 지난 날짜 더하기
    for i in range(1, month):
        total += lastDay(year, i)  # 윤년 확인 포함

    return total + day # 전달 까지 지난 날짜에 이번달 날짜를 더해서 리턴
 
#코드 설명

 total = (year - 1) * 365 + (year - 1) // 4 - (year - 1) // 100 + (year - 1) // 400

 

total -> 윤년을 반영한 작년까지의 총 일수. 윤년이면 1년이 하루가 더 많기 때문에

 

for i in range(1, month):
        total += lastDay(year, i) 
입력한 년도의 바로 직전 달 까지 몇 일이 지났는지 계산해서 total에 더해준다
 
여기까지 하면 total은 현재 저번 달 까지의 모든 일수를 더한것

return total + day

 

마지막에 이번달 날짜까지 더한다.

 

요일 반환

def weekDay(yearmonthday):
    return totalDay(year, month, day) % 7
  • weekDay 인수로 년, 월, 일을 넘겨받아 요일을 계산해 숫자로 리턴하는 함수
  • 1년 1월 1일 부터 인수로 넘겨받은 년, 월, 일 까지 지난 날짜의 합계를 7로 나눈 나머지 반환
  • 일요일(0), 월요일(1), 화요일(2), 수요일(3), 목요일(4), 금요일(5), 토요일(6)

달력 확인

if __name__ == "__main__":
    
    # 달력 프로그램 도입부
    year, month = map(intinput('달력을 출력할 년, 월을 입력하세요 : ').split())
    print('=' * 28)
    print('         {0:4d}년{1:2d}월'.format(year, month))
    print('=' * 28)
    print(' 일  월  화  수  목  금  토 ')
    print('=' * 28)  

    # 1일이 출력될 요일의 위치를 맞추기 위해서 1일의 요일만큼 반복하며 빈칸을 출력
    for i in range(weekDay(year, month, 1)):        
        print('    ', end = '')

    # 1일 부터 달력을 출력할 달의 마지막 날짜까지 반복하며 달력을 출력
    for i in range(1, lastDay(year, month) + 1):
        print(' {0:2d} '.format(i), end = ''


        # 출력한 날짜(i)가 토요일이고 그 달의 마지막 날짜가 아니면 줄바꿈
        if weekDay(year, month, i) == 6 and i != lastDay(year, month):
            print()


    print('\n' + '=' * 28# 달력 하단

사용자에게 원하는 년도와 월을 받아서 달력을 만드는 함수.

 

   print('=' * 28)
    print('         {0:4d}년{1:2d}월'.format(year, month))
    print('=' * 28)
    print(' 일  월  화  수  목  금  토 ')
    print('=' * 28
이 부분은 달력처럼 보이기 위한 포맷생성

작동 확인

 

이번달 넣기

결과

윈도우 달력과 비교

'데이터 분석 실습 > Python' 카테고리의 다른 글

뉴스 3줄 요약하기  (1) 2023.04.20
Disney 데이터 시각화 with Google Colab  (1) 2023.04.11
복사했습니다!