Rookies 5일차: Python 개념 학습 3
☀️공지 사항☀️ 해당 게시글은 SK 쉴더스 루키즈, 생성형AI 활용 사이버보안 전문인력 양성과정 을 수업을 듣고 정리한 글입니다. 자세한 교육 정보는 SK 쉴더스 홈페이지 를 확인해주세요.
학습 내용 요약 (25/10/29)
1. 분기문 (Conditional Statements)
파이썬에서 if, elif, else를 사용한 분기문(조건문)은 특정 조건에 따라 프로그램의 흐름을 제어한다. 이는 특히 보안에서 입력 값 검증이나 접근 제어 로직을 구현할 때 매우 중요하다.
1.1 기본 구조
Python
if (논리값 또는 표현식) :
# 실행 코드
elif (논리값 또는 표현식) :
# 실행 코드
else :
# 실행 코드
1.2 활용 예시
1.2.1 점수 등급 판별
입력받은 점수(Score)를 기준으로 A+, A-, B, C, D, F 등급을 나누는 중첩(nested) if와 elif 구조를 사용했다.
score = int(input('점수를 입력하세요 : '))
print('type - ' , type(score))
if score >= 90 :
if score >= 95 :
print('A+')
else :
print('A-')
elif score >= 80 :
print('B')
elif score >= 70 :
print('C')
elif score >= 60 :
print('D')
else :
print('F')
1.2.2 윤년 판별 (Quiz)
연도(Year)가 4의 배수이고 100의 배수가 아니거나( and, or 논리 연산자 사용) 400의 배수일 때를 윤년으로 판단하는 복합 조건을 처리했다.
year = int(input('년도를 입력하세요. : '))
if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):
print('윤년입니다.')
else:
print('윤년이 아닙니다.')
1.2.3 컬렉션 포함 여부 (in)
리스트(areas)나 딕셔너리(dictTmp)에서 특정 요소나 키의 존재 유무를 if ... in ... 구문을 이용해 확인했다. 이는 화이트리스트/블랙리스트 기반의 접근 제어 로직 구현에 응용될 수 있다.
dictTmp = {'melon' : 100 , 'bravo' : 200 , 'bibibig' : 300 }
print('키 존재 유무를 판단하고 싶다면 - ')
target = 'banana'
print('논리값 - ' , target in dictTmp )
if target in dictTmp :
print(dictTmp[target])
else :
print(f'{target} 키는 대상이 아닙니다.')
2. 삼항 연산자 (Ternary Operator)
파이썬의 삼항 연산자는 조건에 따라 두 개의 값 중 하나를 선택하는 간결한 방법을 제공하며, 한 줄로 간단한 분기 로직을 표현할 때 유용하다.
2.1 기본 구조
[조건의 결과] if [조건] else [else의 결과]
2.2 활용 예시
-
두 변수 중 최댓값을 결정하는 데 사용했다.
-
리스트 컴프리헨션 내에서 사용해 리스트의 각 요소가 짝수인지 홀수인지를 효율적으로 판별했다.
-
중첩 삼항 연산을 통해 핸드폰 번호의 접두사(
Prefix)에 따라 통신사를 확인하는 로직을 구현했다. 이는 코드의 가독성을 해칠 수 있으므로 복잡한 조건에서는 지양하는 것이 좋다.
중첩 삼항 연산을 활용한 코드 예시
# 통신사의 정보를 확인
phone = input('핸드폰 번호를 입력하세요 ex) xxx-xxxx-xxxx :')
prefix = phone.split('-')[0]
result = "SK" if prefix == '011' else "KT" if prefix == '016' else "LG" if prefix == '019' else 'eroor'
print(result)
----------------------------------------------------------------------
# input 함수를 이용해서 주민번호 입력 ex) xxxxxx-x09xxxx 출생지가 서울인지 아닌지 판단
ssn = input('ssn number: ')
seoulCity = ["00", "01", "02", "03", "04", "05", "06", "07", "08"]
if ssn.split('-')[1][1:3] in seoulCity :
print('서울 출생')
else :
print('지방 출생')
# 삼항 연상자로 해보기
print('case02 - ')
print('서울') if ssn.split('-')[1][1:3] in seoulCity else print('지방 출생')
3. 반복문 (Loop Statements)
for와 while 반복문은 코드 블록을 여러 번 실행하는 데 사용되며, break와 continue는 반복 흐름을 제어한다. 파일 처리, 로그 분석, 대규모 데이터 처리 등에서 필수적인 구문이다.
-
for반복문:range, 리스트, 튜플, 딕셔너리 등 열거형 데이터의 요소를 순회한다.-
enumerate: 데이터와 그 인덱스를 동시에 순회 -
단어 리스트에서 각 단어의 빈도수를 계산하는 로직을 구현 가능
-
구구단을 출력하는 이중
for루프 활용
-
-
for ~ else/while ~ else:for또는while루프가break없이 정상적으로 완료되었을 때만else블록의 코드가 실행된다. 이는 숫자 맞히기 게임(Guess Game)에서 기회(MaxTries)를 모두 사용했을 때의 메시지를 출력하는 데 활용되었다. -
while반복문: 조건식이 참인 동안 반복 실행된다. 시작 날짜부터 종료 날짜까지의 리스트를 생성하는 데while루프와timedelta를 함께 사용했다.
timedelta 코드 예시
from datetime import datetime, timedelta # <-- 모듈 import 추가!
startDay = datetime.strptime('2025-10-01', '%Y-%m-%d')
endDay = datetime.strptime('2025-10-10', '%Y-%m-%d')
lst = [] # 날짜 리스트 생성
currentDay = startDay
# while
while currentDay <= endDay :
lst.append(currentDay.strftime('%Y-%m-%d'))
currentDay += timedelta(days = 1)
print(lst)
-----------------------------------------------------------------
# 출력 결과
['2025-10-01', '2025-10-02', '2025-10-03', '2025-10-04', '2025-10-05', '2025-10-06', '2025-10-07', '2025-10-08', '2025-10-09', '2025-10-10']
4. 날짜/시간 처리 모듈 (Date/Time Handling)
정확한 날짜 및 시간 처리는 로그 분석, 인증 만료 시간 검증 등 보안 영역에서 매우 중요하다.
datetime 모듈:
-
date.today(): 날짜 정보만 가져온다. -
datetime.today(): 날짜와 시간 정보(시분초, 마이크로초)까지 가져온다.
날짜 연산:
-
timedelta: 날짜 간의 차이 또는 단순 시간 간격(days=1,hours=3등)을 나타낸다. 날짜 객체에 더하거나 뺄 수 있다. -
dateutil.relativedelta:years,months등 더 직관적이고 복잡한 날짜 연산을 위해 사용된다.
형식 변환:
-
datetime.strptime(string, format): 문자열 형태의 날짜를datetime객체로 변환한다. (문자열)'2025-10-29'-> 날짜 객체 -
datetime.strftime(format):datetime객체를 원하는 문자열 형식으로 변환한다. - 날짜 객체 -> (문자열)'2025-10-29' -
calendar.monthrange(year, month): 특정 연도와 월을 입력받아 해당 월의 시작 요일과 총 일수(마지막 날짜)를 알려주는 매우 유용한 기능이다.
(확장) calendar.monthrange
monthrange() 함수는 두 개의 정수 값을 담은 튜플 형태로 결과를 반환한다.
시작 요일 인덱스: 해당 월 1일의 요일을 0 (월요일)부터 6 (일요일)까지의 숫자로 반환한다.
총 일수: 해당 월의 마지막 날짜 (예: 28, 29, 30, 31)를 반환한다.
(심화) 날짜/시간 처리 코드 연습
# ==============================================================================
# 1. 날짜 및 시간 처리 모듈 임포트 (Import Modules)
# ==============================================================================
# dateutil.relativedelta: '1년', '1개월'처럼 직관적이고 큰 단위의 날짜 차이를 계산하는 모듈이다.
from dateutil.relativedelta import relativedelta
# datetime.timedelta: '24시간', '1일'과 같은 고정된 시간 간격을 나타내는 클래스이다.
# datetime.date: 날짜 정보만을 저장하는 클래스이다.
from datetime import timedelta , date
print('날짜에 대한 연산을 도와주는 모듈 - dateutill')
# 현재 시스템의 날짜를 가져와 Today 변수에 할당한다. (Today: YYYY-MM-DD 형식)
Today = date.today()
print(f'현재 날짜 (Today) - {Today}')
# ==============================================================================
# 2. timedelta를 이용한 단순 날짜 연산
# ==============================================================================
print('\n--- timedelta를 이용한 단순 날짜 연산 (고정 간격) ---')
# 파이썬의 date 객체에는 정수(1)를 직접 더할 수 없다. (주석 처리)
# print(Today + 1 ) # Error: TypeError 발생
# 1일(24시간)의 고정된 시간 간격을 가지는 timedelta 객체를 생성한다.
DayDelta = timedelta(days=1)
print(f'timedelta 객체 (DayDelta) - {DayDelta}')
# 현재 날짜(Today)에 DayDelta(1일)를 더하여 다음 날짜를 얻는다.
# timedelta는 주로 짧고 고정된 시간 간격 연산에 사용된다.
NextDay = Today + DayDelta
print(f'현재 날짜에 하루를 더한다면: {NextDay}')
# ==============================================================================
# 3. relativedelta를 이용한 복합 날짜 연산
# ==============================================================================
print('\n--- relativedelta를 이용한 복합 날짜 연산 (가변 간격) ---')
# relativedelta는 '1개월'처럼 월별 일수가 다른 가변적인 간격 연산에 유용하다.
DayRelativeDelta = relativedelta(days=1)
MonthRelativeDelta = relativedelta(months=1)
YearRelativeDelta = relativedelta(years=1)
print(f'relativedelta 객체들: 연({YearRelativeDelta}), 월({MonthRelativeDelta}), 일({DayRelativeDelta})')
# 현재 날짜(Today)를 기준으로 순차적으로 날짜를 업데이트한다.
# 1년 뒤의 날짜로 Today를 갱신한다.
Today = Today + YearRelativeDelta
# 갱신된 날짜에서 다시 1개월 뒤의 날짜로 Today를 갱신한다.
Today = Today + MonthRelativeDelta
# 갱신된 날짜에서 다시 1일 뒤의 날짜로 Today를 갱신한다.
Today = Today + DayRelativeDelta
print(f'최종 업데이트된 날짜: {Today}')
댓글 남기기