[Python] input() 함수로 사용자와 상호작용하기
- Developer/Python
- 2025. 3. 14.
안녕하세요, 오늘은 파이썬에서 가장 기본적인 함수 중에 하나인 input() 함수에 대해 파헤쳐 볼게요. 간단해 보이지만 제대로 알고 쓰지 않으면 프로그램 실행 중 예상치 못한 버그가 발생할 수 있습니다.

목차
1. input() 함수 기본 이해하기
파이썬의 input() 함수는 가장 기본적인 사용자 상호작용 도구입니다. 뭐, 별거 없어 보이죠? 하지만 이 단순한 함수 하나로 콘솔 기반 프로그램의 상호작용성을 완전히 바꿀 수 있습니다.
기본적으로 input() 함수는 다음과 같은 특징을 가집니다,
- 사용자로부터 텍스트를 입력받을 때까지 프로그램 실행을 중지합니다.
- Enter 키를 누르면 입력이 완료되고 프로그램이 계속 실행됩니다.
- 입력된 모든 값은 항상 문자열(string)로 반환됩니다.
- 선택적으로 프롬프트 메시지를 표시할 수 있습니다.
가장 기본적인 사용법은 다음과 같습니다:
name = input("이름을 입력하세요: ")
print(f"안녕하세요, {name}님!")
이 코드는 사용자에게 이름을 물어보고, 입력받은 이름으로 인사를 합니다. 단순하지만 효과적이죠. 하지만 여기서 주의할 점은 input() 함수가 반환하는 값은 항상 문자열이라는 것입니다. 이 부분을 간과하면 나중에 골치아픈 버그를 만나게 됩니다.
2. 다양한 데이터 타입 입력받기
앞서 말했듯이, input() 함수는 항상 문자열을 반환합니다. 하지만 실제 프로그램에서는 정수, 실수, 불리언 등 다양한 타입의 데이터가 필요하죠. 이럴 때는 변환 함수를 사용해야 합니다.
데이터 타입 | 변환 함수 | 예시 코드 | 주의사항 |
---|---|---|---|
정수(int) | int() | age = int(input("나이: ")) | 숫자가 아닌 입력 시 ValueError 발생 |
실수(float) | float() | height = float(input("키(cm): ")) | 숫자가 아닌 입력 시 ValueError 발생 |
불리언(bool) | bool() | is_student = input("학생? (y/n): ") == 'y' | 빈 문자열, '0', 'False'는 False 반환 |
리스트(list) | split() + list() | nums = input("숫자들: ").split() | 공백으로 구분된 입력을 리스트로 변환 |
정수 리스트 | split() + map() | nums = list(map(int, input().split())) | 공백으로 구분된 숫자들을 정수 리스트로 |
데이터 변환 시 가장 흔한 실수는 예외 처리를 하지 않는 것입니다. 사용자가 숫자를 입력해야 하는데 문자를 입력하면 프로그램이 크래시됩니다. 항상 예외 처리를 하는 습관을 들이는 것이 좋은 것 같습니다.
try:
age = int(input("나이를 입력하세요: "))
except ValueError:
print("유효한 숫자를 입력해주세요.")
age = 0 # 기본값 설정
3. 사용자 입력 검증하기
사용자 입력을 처리할 때 가장 중요한 것은 검증입니다. "쓰레기를 넣으면 쓰레기가 나온다(Garbage In, Garbage Out)"는 프로그래밍 격언이 있죠. 입력값을 제대로 검증하지 않으면 프로그램이 예기치 않게 동작하거나 보안 취약점이 발생할 수 있습니다.
사용자 입력 검증 시 고려해야 할 사항들은 다음 것들이 있습니다.
- 타입 검증: 예상한 데이터 타입인지 확인합니다.
- 범위 검증: 값이 허용 범위 내에 있는지 확인합니다.
- 형식 검증: 특정 패턴을 따르는지 확인합니다(예: 이메일, 전화번호).
- 중복 검증: 이미 존재하는 값인지 확인합니다.
- 안전성 검증: 악의적인 입력이 없는지 확인합니다.
다음은 간단한 입력 검증 예시입니다.
def get_age():
while True:
try:
age = int(input("나이를 입력하세요: "))
if age < 0 or age > 120:
print("나이는 0~120 사이여야 합니다.")
continue
return age
except ValueError:
print("유효한 숫자를 입력해주세요.")
이 함수는 사용자가 올바른 나이를 입력할 때까지 계속 물어봅니다. 음수나 비현실적으로 큰 수는 거부합니다. 이런 방식의 검증은 사용자 경험을 향상시키고 프로그램의 안정성을 높입니다.
사용자 입력에서 대소문자를 구분하지 않아야 할 경우, lower()
또는 upper()
메소드를 사용하면 편리합니다. 예를 들어, "Yes", "YES", "yes"를 모두 동일하게 처리하려면,
response = input("계속하시겠습니까? (y/n): ").lower()
if response == 'y' or response == 'yes':
# 사용자가 y 또는 yes를 입력한 경우
pass
4. 고급 입력 테크닉
기본적인 input() 함수 사용법을 넘어, 더 복잡한 사용자 상호작용을 위한 고급 테크닉들이 있습니다. 이런 테크닉들은 사용자 경험을 향상시키고 더 강력한 콘솔 애플리케이션을 만드는 데 도움이 됩니다.
여러 줄 입력 받기
때로는 한 줄이 아닌 여러 줄의 입력을 받아야 할 경우가 있습니다. 예를 들어, 간단한 메모나 여러 줄의 코드를 입력받을 때입니다. 이럴 때는 특정 종료 조건을 설정하여 여러 줄의 입력을 처리할 수 있습니다.
def get_multiline_input():
print("여러 줄의 텍스트를 입력하세요. 입력을 마치려면 빈 줄을 입력하세요.")
lines = []
while True:
line = input()
if line:
lines.append(line)
else:
break
return '\n'.join(lines)
text = get_multiline_input()
print("\n입력한 텍스트:")
print(text)
비밀번호 입력 처리
비밀번호와 같은 민감한 정보를 입력받을 때는 입력 내용이 화면에 표시되지 않도록 하는 것이 좋습니다. Python의 getpass 모듈을 사용하면 이를 쉽게 처리할 수 있습니다.
import getpass
username = input("사용자 이름: ")
password = getpass.getpass("비밀번호: ")
print(f"사용자 이름 '{username}'으로 로그인 시도 중...")
타임아웃 설정하기
기본적으로 input() 함수는 사용자가 입력을 완료할 때까지 무한정 기다립니다. 하지만 실제 애플리케이션에서는 타임아웃을 설정하여 일정 시간 내에 응답이 없으면 기본값을 사용하거나 다음 단계로 넘어가는 것이 좋습니다. signal 모듈을 사용하여 이를 구현할 수 있습니다.
import signal
def timeout_handler(signum, frame):
raise TimeoutError("입력 시간이 초과되었습니다.")
def get_input_with_timeout(prompt, timeout=10):
# 타임아웃 핸들러 설정
signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(timeout) # 초 단위로 타임아웃 설정
try:
user_input = input(prompt)
signal.alarm(0) # 타임아웃 해제
return user_input
except TimeoutError as e:
print(e)
return None # 타임아웃 시 기본값 반환
# 10초 안에 입력하지 않으면 타임아웃
name = get_input_with_timeout("이름을 입력하세요 (10초 이내): ")
if name:
print(f"안녕하세요, {name}님!")
else:
print("입력이 없어 기본 이름을 사용합니다.")
name = "익명"
이 방법은 Windows에서는 제대로 작동하지 않을 수 있습니다. Windows에서는 대신 threading 모듈을 사용하여 비슷한 기능을 구현할 수 있습니다. 이런 플랫폼 간 차이점도 알고 있어야 합니다.
5. input() 함수의 대안들
표준 input() 함수는 간단한 프로그램에는 충분하지만, 더 복잡한 사용자 상호작용을 위해서는 더 강력한 도구들이 필요합니다. 다음은 input()의 대안이 될 수 있는 라이브러리들입니다.
라이브러리 | 주요 기능 | 사용 케이스 | 장단점 |
---|---|---|---|
PyInquirer | 대화형 CLI 메뉴, 체크박스, 리스트 선택 등 | 대화형 명령줄 애플리케이션 | ✅ 풍부한 사용자 경험 ❌ 의존성 관리 필요 |
Prompt Toolkit | 강력한 명령줄 인터페이스, 자동완성, 구문 강조 | 고급 터미널 애플리케이션, REPL | ✅ 강력한 커스터마이징 ❌ 학습 곡선이 가파름 |
Typer | 타입 힌트를 사용한 CLI 생성 | 명령줄 도구 개발 | ✅ 타입 안전성 ❌ 단순 입력에는 과도 |
Click | 명령줄 인터페이스 생성 도구 | 복잡한 CLI 애플리케이션 | ✅ 구성이 쉬움 ❌ 간단한 입력에는 오버엔지니어링 |
Rich | 터미널 텍스트 스타일링, 표, 진행 막대 등 | 풍부한 터미널 출력이 필요한 애플리케이션 | ✅ 시각적으로 멋진 출력 ❌ 입력보다는 출력에 초점 |
이러한 라이브러리들은 input() 함수보다 훨씬 더 풍부한 사용자 경험을 제공합니다. 예를 들어, PyInquirer를 사용하면 다음과 같은 대화형 메뉴를 쉽게 만들 수 있습니다:
from PyInquirer import prompt
questions = [
{
'type': 'list',
'name': 'language',
'message': '선호하는 프로그래밍 언어는?',
'choices': ['Python', 'JavaScript', 'Java', 'C++', '기타']
},
{
'type': 'checkbox',
'name': 'frameworks',
'message': '사용해 본 프레임워크는?',
'choices': [
{'name': 'Django'},
{'name': 'Flask'},
{'name': 'React'},
{'name': 'Angular'},
{'name': 'Vue'}
]
}
]
answers = prompt(questions)
print(f"선택한 언어: {answers['language']}")
print(f"경험한 프레임워크: {', '.join(answers['frameworks'])}")
물론, 간단한 스크립트에는 표준 input() 함수가 더 적합할 수 있습니다. 모든 상황에 도구의 복잡성과 기능을 균형있게 선택해야 합니다.
6. 실전 프로젝트에 적용하기
이론적인 내용을 충분히 살펴봤으니, 이제 실제 프로젝트에 입력 기능을 어떻게 적용할 수 있는지 알아보겠습니다. 다음은 input() 함수를 활용한 몇 가지 실용적인 프로젝트 아이디어입니다.
간단한 퀴즈 애플리케이션
사용자 입력을 활용하여 간단한 퀴즈 애플리케이션을 만들 수 있습니다. 다음은 기본적인 구조입니다:
- 질문과 답변 쌍을 딕셔너리 리스트로 정의합니다.
- 각 질문을 표시하고 사용자 입력을 받습니다.
- 입력을 검증하고 정답 여부를 확인합니다.
- 점수를 계산하고 최종 결과를 표시합니다.
할 일 관리 애플리케이션
입력 함수를 활용하여 콘솔 기반의 할 일 관리 애플리케이션을 만들 수 있습니다. 사용자는 다음과 같은 작업을 수행할 수 있습니다.
- 새로운 할 일 추가하기
- 기존 할 일 완료로 표시하기
- 할 일 삭제하기
- 모든 할 일 목록 보기
- 데이터를 파일에 저장하기
간단한 계산기
사용자 입력을 활용하여 기본적인 수학 연산을 수행하는 계산기를 만들 수 있습니다. 식을 문자열로 입력받아 eval() 함수로 계산하거나, 숫자와 연산자를 따로 입력받아 계산할 수 있습니다.
주의: 실제 애플리케이션에서는 보안상의 이유로 eval() 함수 사용을 피하는 것이 좋습니다. 대신 안전한 파싱 방법을 사용하세요.
텍스트 기반 어드벤처 게임
입력 함수를 활용하여 텍스트 기반 어드벤처 게임을 만들 수 있습니다. 사용자는 "북", "남", "동", "서"와 같은 방향이나 "살펴보기", "집기", "사용하기"와 같은 명령어를 입력하여 게임을 진행할 수 있습니다.
colorama 라이브러리를 사용하면 입력 프롬프트나 출력에 색상을 추가할 수 있습니다. 이는 사용자 경험을 향상시키고 중요한 정보를 구분하는 데 도움이 됩니다.
from colorama import init, Fore, Style
init() # Windows에서 필요
# 색상이 있는 입력 프롬프트
name = input(f"{Fore.GREEN}이름을 입력하세요: {Style.RESET_ALL}")
# 색상이 있는 출력
print(f"{Fore.BLUE}안녕하세요, {Fore.YELLOW}{name}{Fore.BLUE}님!{Style.RESET_ALL}")
Python 2에서는 input()과 raw_input()이 구분되어 있었습니다. input()은 입력값을 평가(eval)하고, raw_input()은 문자열로 반환했습니다. Python 3에서는 raw_input()이 제거되고 input()이 항상 문자열을 반환하도록 변경되었습니다. 즉, Python 3의 input()은 Python 2의 raw_input()과 동일한 동작을 합니다.
문자열의 strip() 메소드를 사용하면 됩니다. 예를 들어 user_input = input("입력: ").strip()와 같이 사용합니다. strip()은 문자열 양쪽의 공백을 제거하고, lstrip()은 왼쪽, rstrip()은 오른쪽 공백을 제거합니다.
split() 메소드를 사용하면 공백으로 구분된 여러 값을 입력받을 수 있습니다. 예를 들어 x, y = map(int, input("두 숫자 입력: ").split())는 두 정수를 한 번에 입력받습니다. 다른 구분자를 사용하려면 split(',')와 같이 인자를 전달하면 됩니다.
실용적인 코드 예제: 대화형 할 일 관리자
아래 코드는 input() 함수를 사용한 간단한 할 일 관리 애플리케이션입니다. 사용자는 할 일을 추가, 완료 표시, 삭제하고 목록을 볼 수 있습니다. 또한 데이터를 파일에 저장하고 불러올 수 있습니다.
import json
import os
from datetime import datetime
class TodoApp:
def __init__(self, file_path="todos.json"):
self.file_path = file_path
self.todos = []
self.load_todos()
def load_todos(self):
"""파일에서 할 일 목록을 불러옵니다."""
if os.path.exists(self.file_path):
try:
with open(self.file_path, 'r', encoding='utf-8') as f:
self.todos = json.load(f)
print(f"{len(self.todos)}개의 할 일을 불러왔습니다.")
except json.JSONDecodeError:
print("파일 형식이 잘못되었습니다. 빈 목록으로 시작합니다.")
self.todos = []
else:
print("저장된 할 일이 없습니다. 새 목록을 시작합니다.")
def save_todos(self):
"""할 일 목록을 파일에 저장합니다."""
with open(self.file_path, 'w', encoding='utf-8') as f:
json.dump(self.todos, f, ensure_ascii=False, indent=2)
print(f"{len(self.todos)}개의 할 일을 저장했습니다.")
def add_todo(self):
"""새로운 할 일을 추가합니다."""
title = input("할 일 제목: ").strip()
if not title:
print("제목은 비워둘 수 없습니다.")
return
description = input("상세 설명 (선택 사항): ").strip()
# 우선순위 입력 (1-5)
while True:
try:
priority = input("우선순위 (1-5, 높을수록 중요): ")
priority = int(priority)
if 1 <= priority <= 5:
break
else:
print("우선순위는 1에서 5 사이의 숫자여야 합니다.")
except ValueError:
print("숫자를 입력해주세요.")
# 마감일 입력 (선택 사항)
due_date = None
add_due_date = input("마감일을 추가하시겠습니까? (y/n): ").lower() == 'y'
if add_due_date:
while True:
date_str = input("마감일 (YYYY-MM-DD): ")
try:
due_date = datetime.strptime(date_str, "%Y-%m-%d").strftime("%Y-%m-%d")
break
except ValueError:
print("올바른 날짜 형식(YYYY-MM-DD)으로 입력해주세요.")
# 새 할 일 추가
todo = {
"id": len(self.todos) + 1,
"title": title,
"description": description,
"priority": priority,
"due_date": due_date,
"completed": False,
"created_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
self.todos.append(todo)
print(f"'{title}' 할 일이 추가되었습니다.")
def list_todos(self):
"""모든 할 일 목록을 표시합니다."""
if not self.todos:
print("할 일이 없습니다.")
return
# 완료 여부로 필터링
show_option = input("모든 할 일(a), 완료된 할 일(c), 미완료 할 일(p) 중 선택: ").lower()
filtered_todos = []
if show_option == 'c':
filtered_todos = [todo for todo in self.todos if todo['completed']]
print("\n=== 완료된 할 일 목록 ===")
elif show_option == 'p':
filtered_todos = [todo for todo in self.todos if not todo['completed']]
print("\n=== 미완료 할 일 목록 ===")
else:
filtered_todos = self.todos
print("\n=== 전체 할 일 목록 ===")
# 우선순위나 마감일로 정렬
sort_option = input("정렬 기준: 우선순위(p), 마감일(d), 생성일(c): ").lower()
if sort_option == 'p':
filtered_todos.sort(key=lambda x: x['priority'], reverse=True)
elif sort_option == 'd':
# 마감일이 없는 항목은 맨 뒤로
filtered_todos.sort(key=lambda x: x['due_date'] if x['due_date'] else "9999-12-31")
else:
# 기본은 생성일 기준
filtered_todos.sort(key=lambda x: x['created_at'])
print("\nID | 제목 | 우선순위 | 마감일 | 완료 여부")
print("-" * 60)
for todo in filtered_todos:
status = "✅" if todo['completed'] else "❌"
due = todo['due_date'] if todo['due_date'] else "없음"
print(f"{todo['id']} | {todo['title']} | {todo['priority']} | {due} | {status}")
def complete_todo(self):
"""할 일을 완료로 표시합니다."""
if not self.todos:
print("할 일이 없습니다.")
return
try:
todo_id = int(input("완료할 할 일 ID: "))
for todo in self.todos:
if todo['id'] == todo_id:
todo['completed'] = True
print(f"'{todo['title']}' 할 일이 완료로 표시되었습니다.")
return
print(f"ID {todo_id}인 할 일을 찾을 수 없습니다.")
except ValueError:
print("유효한 ID를 입력해주세요.")
def delete_todo(self):
"""할 일을 삭제합니다."""
if not self.todos:
print("할 일이 없습니다.")
return
try:
todo_id = int(input("삭제할 할 일 ID: "))
for i, todo in enumerate(self.todos):
if todo['id'] == todo_id:
removed = self.todos.pop(i)
print(f"'{removed['title']}' 할 일이 삭제되었습니다.")
return
print(f"ID {todo_id}인 할 일을 찾을 수 없습니다.")
except ValueError:
print("유효한 ID를 입력해주세요.")
def run(self):
"""애플리케이션의 메인 루프입니다."""
while True:
print("\n=== 할 일 관리자 ===")
print("1. 할 일 추가")
print("2. 할 일 목록 보기")
print("3. 할 일 완료로 표시")
print("4. 할 일 삭제")
print("5. 저장하고 종료")
choice = input("\n선택하세요 (1-5): ")
if choice == '1':
self.add_todo()
elif choice == '2':
self.list_todos()
elif choice == '3':
self.complete_todo()
elif choice == '4':
self.delete_todo()
elif choice == '5':
self.save_todos()
print("프로그램을 종료합니다.")
break
else:
print("잘못된 선택입니다. 다시 시도하세요.")
if __name__ == "__main__":
app = TodoApp()
app.run()
이 코드는 input() 함수의 다양한 활용 방법을 보여줍니다:
- 기본 텍스트 입력(할 일 제목, 설명)
- 숫자 입력 및 변환(우선순위)
- 날짜 형식 검증(마감일)
- 메뉴 선택 입력(애플리케이션 기능)
- 예외 처리(잘못된 ID 입력)
이 예제는 확장성도 좋습니다. 태그 기능, 알림 설정, 반복 작업 등 다양한 기능을 추가할 수 있습니다. 사용자 입력을 활용한 애플리케이션은 이처럼 간단한 코드로도 유용한 기능을 제공할 수 있습니다.
맞춤형 사용자 입력 도우미 함수
프로젝트에서 입력 처리를 반복적으로 수행해야 한다면, 다음과 같은 맞춤형 입력 도우미 함수를 만드는 것이 좋습니다.
def get_string(prompt, allow_empty=False):
"""문자열 입력을 받는 함수"""
while True:
value = input(prompt).strip()
if value or allow_empty:
return value
print("값을 입력해주세요.")
def get_int(prompt, min_value=None, max_value=None):
"""정수 입력을 받는 함수"""
while True:
try:
value = int(input(prompt))
if (min_value is None or value >= min_value) and \
(max_value is None or value <= max_value):
return value
range_str = ""
if min_value is not None and max_value is not None:
range_str = f"{min_value}에서 {max_value} 사이의 "
elif min_value is not None:
range_str = f"{min_value} 이상의 "
elif max_value is not None:
range_str = f"{max_value} 이하의 "
print(f"{range_str}값을 입력해주세요.")
except ValueError:
print("유효한 숫자를 입력해주세요.")
def get_float(prompt, min_value=None, max_value=None):
"""실수 입력을 받는 함수"""
while True:
try:
value = float(input(prompt))
if (min_value is None or value >= min_value) and \
(max_value is None or value <= max_value):
return value
range_str = ""
if min_value is not None and max_value is not None:
range_str = f"{min_value}에서 {max_value} 사이의 "
elif min_value is not None:
range_str = f"{min_value} 이상의 "
elif max_value is not None:
range_str = f"{max_value} 이하의 "
print(f"{range_str}값을 입력해주세요.")
except ValueError:
print("유효한 숫자를 입력해주세요.")
def get_choice(prompt, choices):
"""미리 정의된 선택지 중에서 선택하는 함수"""
choice_str = "/".join(choices)
while True:
value = input(f"{prompt} ({choice_str}): ").lower()
if value in [c.lower() for c in choices]:
return value
print(f"{choice_str} 중에서 선택해주세요.")
def get_date(prompt, format="%Y-%m-%d"):
"""날짜 입력을 받는 함수"""
while True:
try:
date_str = input(prompt)
date = datetime.strptime(date_str, format)
return date
except ValueError:
print(f"올바른 날짜 형식({format})으로 입력해주세요.")
이러한 도우미 함수를 사용하면 코드가 더 깔끔해지고 입력 검증이 일관되게 이루어집니다. 예를 들어, 위의 할 일 관리자 애플리케이션에서는 다음과 같이 사용할 수 있습니다.
# 기존 코드
title = input("할 일 제목: ").strip()
if not title:
print("제목은 비워둘 수 없습니다.")
return
# 도우미 함수 사용
title = get_string("할 일 제목: ", allow_empty=False)
# 기존 코드
while True:
try:
priority = input("우선순위 (1-5, 높을수록 중요): ")
priority = int(priority)
if 1 <= priority <= 5:
break
else:
print("우선순위는 1에서 5 사이의 숫자여야 합니다.")
except ValueError:
print("숫자를 입력해주세요.")
# 도우미 함수 사용
priority = get_int("우선순위 (1-5, 높을수록 중요): ", 1, 5)
마무리
지금까지 파이썬의 input() 함수에 대해 깊이 알아보았습니다. 단순한 함수처럼 보이지만, 제대로 활용하면 다양한 사용자 상호작용을 구현할 수 있습니다. 물론 GUI 애플리케이션이나 웹 애플리케이션에서는 다른 입력 방식이 사용되지만, 콘솔 애플리케이션에서는 input() 함수가 핵심입니다.
이 글에서 다룬 내용을 요약하자면:
- input() 함수의 기본 동작을 이해했습니다.
- 다양한 데이터 타입을 입력받는 방법을 배웠습니다.
- 사용자 입력을 검증하는 다양한 방법을 알아보았습니다.
- 고급 입력 테크닉(여러 줄 입력, 비밀번호, 타임아웃)을 살펴보았습니다.
- input() 함수의 대안이 되는 라이브러리들을 확인했습니다.
- 실제 프로젝트에 적용하는 방법을 예제 코드와 함께 배웠습니다.
여기서 배운 내용을 토대로, 이제 여러분은 사용자와 상호작용하는 더 강력한 파이썬 프로그램을 만들 수 있을 것입니다. 사용자 입력을 올바르게 처리하는 것은 모든 프로그램의 기본이자 사용성을 좌우하는 중요한 요소입니다.
다음에는 파이썬의 다른 I/O 관련 기능, 예를 들어 파일 입출력이나 네트워크 통신에 대해 더 자세히 알아보는 시간을 가져보겠습니다. 그때까지 즐겁게 코딩하세요!
'Developer > Python' 카테고리의 다른 글
[Python] 파이썬 Pandas로 엑셀 데이터 읽고 분석하기 (0) | 2025.03.17 |
---|---|
[Python] 랜덤 숫자 맞추기 (0) | 2025.03.14 |
[Python] 구구단 출력 프로그램 만들기 (0) | 2025.03.14 |
[Python] 함수 정의와 호출: 재사용 가능한 코드 작성법 (0) | 2025.03.14 |
[파이썬] 리스트, 튜플, 딕셔너리 (0) | 2025.03.14 |