Skip to content

Latest commit

 

History

History

P_02_InputOutput

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

README.md

Python 입출력 (Input/Output) 완벽 가이드

Python의 기본 입출력 함수인 print()와 input()에 대한 상세한 설명과 예제를 제공합니다.


목차

  1. print() 함수
  2. Raw String (r-string)
  3. 문자열 포맷팅
  4. 서식 지정자 표
  5. input() 함수

1. print() 함수

1.1 기본 출력 방식

print() 함수는 Python에서 가장 기본적인 출력 함수입니다.

print(출력내용1, 출력내용2, 출력내용3)
# 출력결과: 출력내용1 출력내용2 출력내용3

특징:

  • print() 함수는 자동으로 줄바꿈(\n)을 수행
  • 여러 값을 출력할 때 기본적으로 공백으로 구분
  • 디폴트 값: end='\n', sep=' '

1.2 end= 옵션

출력 뒤에 추가할 문자열을 지정합니다. 기본값은 줄바꿈(\n)입니다.

# end 옵션으로 특정 문자열 추가
print(10, end='##')
print('hello', end='**')
print(3.14, end='--')
# 출력결과: 10##hello**3.14--
# 줄바꿈 없이 연속 출력
print(10, end='')
print('hello', end='')
print(3.14, end='')
# 출력결과: 10hello3.14
# 탭으로 구분
print("이름", end='\t')
print("나이", end='\t')
print("주소")
# 출력결과: 이름	나이	주소

1.3 sep= 옵션

출력할 값들 사이를 구분하는 문자열을 지정합니다. 기본값은 공백( )입니다.

# 기본 구분자 (공백)
print(10, 20, 30)
# 출력결과: 10 20 30

# 사용자 정의 구분자
print(10, 20, 30, sep='***')
# 출력결과: 10***20***30

# 쉼표와 공백으로 구분
print("apple", "banana", "cherry", sep=', ')
# 출력결과: apple, banana, cherry

# 줄바꿈으로 구분
print("첫째", "둘째", "셋째", sep='\n')
# 출력결과:
# 첫째
# 둘째
# 셋째

# 화살표로 구분
print("서울", "대전", "대구", "부산", sep=' -> ')
# 출력결과: 서울 -> 대전 -> 대구 -> 부산

1.4 end=와 sep= 함께 사용

print("A", "B", "C", sep="-", end="!\n")
# 출력결과: A-B-C!

# 날짜 형식 출력
print(2024, 1, 15, sep='/', end=' ')
print(14, 30, 0, sep=':')
# 출력결과: 2024/1/15 14:30:0

1.5 이스케이프 문자 (Escape Character)

문자열 내에서 특수한 의미를 가지는 문자들입니다.

이스케이프 문자 설명 예제
\n 줄바꿈 (New Line) print("Hello\nWorld")
\t 탭 (Tab) print("Name\tAge")
\\ 역슬래시 (Backslash) print("C:\\Users")
\' 홑따옴표 print('It\'s good')
\" 쌍따옴표 print("He said \"Hi\"")
\r 캐리지 리턴 (Carriage Return) print("Hello\rWorld")
\b 백스페이스 (Backspace) print("Hello\bWorld")
\0 널 문자 (Null) -

예제:

# 줄바꿈
print("첫 번째 줄\n두 번째 줄\n세 번째 줄")
# 출력결과:
# 첫 번째 줄
# 두 번째 줄
# 세 번째 줄

# 탭 사용
print("이름\t나이\t주소")
print("홍길동\t25\t서울")
print("김철수\t30\t부산")
# 출력결과:
# 이름	나이	주소
# 홍길동	25	서울
# 김철수	30	부산

# 따옴표 출력
print("그가 말했다: \"안녕하세요!\"")
# 출력결과: 그가 말했다: "안녕하세요!"

print('It\'s a beautiful day')
# 출력결과: It's a beautiful day

2. Raw String (r-string)

2.1 개념

Raw String은 문자열 내부의 모든 이스케이프 문자의 특수 기능을 제거한 문자열입니다.

사용 방법: 문자열 앞에 r 또는 R을 붙입니다.


2.2 일반 문자열 vs Raw String

# 일반 문자열 - 이스케이프 문자 해석됨
path = "C:\new\test\file"
print(path)
# 출력결과: C:
# ew	est
# ile  (오류 발생!)

# 역슬래시를 두 번 사용
path = "C:\\new\\test\\file"
print(path)
# 출력결과: C:\new\test\file

# Raw String 사용 - 가장 간단한 방법
path = r"C:\new\test\file"
print(path)
# 출력결과: C:\new\test\file

2.3 Windows 경로에서 활용

# 일반적인 방법 (역슬래시 두 번)
path1 = "C:\\Users\\Documents\\Python\\project"
print(path1)
# 출력결과: C:\Users\Documents\Python\project

# Raw String 사용 (권장)
path2 = r"C:\Users\Documents\Python\project"
print(path2)
# 출력결과: C:\Users\Documents\Python\project

# 두 방법 비교
path_normal = "C:\\Windows\\System\\Python"
path_raw = r"C:\Windows\System\Python"
print(path_normal == path_raw)
# 출력결과: True

2.4 정규 표현식에서의 Raw String

정규 표현식에서는 Raw String이 매우 유용합니다.

import re

# 일반 문자열 - 복잡함
pattern1 = "\\d+\\.\\d+"  # 소수점 숫자 매칭

# Raw String - 간결함
pattern2 = r"\d+\.\d+"   # 동일한 패턴

text = "가격은 123.45원 입니다."
print(re.findall(pattern1, text))  # ['123.45']
print(re.findall(pattern2, text))  # ['123.45']

2.5 Raw String 주의사항

# Raw String도 역슬래시로 끝날 수 없음
# path = r"C:\Users\"  # SyntaxError 발생!

# 해결 방법 1: 역슬래시 추가
path = r"C:\Users" + "\\"
print(path)
# 출력결과: C:\Users\

# 해결 방법 2: 슬래시 사용
path = r"C:\Users/"
print(path)
# 출력결과: C:\Users/

3. 문자열 포맷팅 (Formatting)

Python에서 문자열에 변수 값을 삽입하는 세 가지 방법을 설명합니다.


3.1 방법 1: % 연산자 사용 (Old Style)

C 언어 스타일의 포맷팅 방법입니다.

기본 구문: "문자열 %서식지정자" % (값)

# 문자열 삽입
print("Hello %s" % ("파이썬"))
# 출력결과: Hello 파이썬

# 변수 사용
name = "Python"
print("I love %s" % name)
# 출력결과: I love Python

# 여러 값 삽입
print("주소: %s  우편번호: %d" % ('서울', 12345))
# 출력결과: 주소: 서울  우편번호: 12345

# 정수와 실수
age = 25
height = 175.5
print("나이: %d세, 키: %.1f cm" % (age, height))
# 출력결과: 나이: 25세, 키: 175.5 cm

소수점 자리수 지정:

import math
PI = math.pi

print("정수: %d" % PI)           # 출력결과: 정수: 3
print("실수: %f" % PI)           # 출력결과: 실수: 3.141593
print("소수점 1자리: %.1f" % PI)  # 출력결과: 소수점 1자리: 3.1
print("소수점 3자리: %.3f" % PI)  # 출력결과: 소수점 3자리: 3.142
print("소수점 5자리: %.5f" % PI)  # 출력결과: 소수점 5자리: 3.14159

너비 지정:

# 최소 너비 지정 (오른쪽 정렬)
print("[%10s]" % "hello")     # 출력결과: [     hello]
print("[%10d]" % 123)         # 출력결과: [       123]

# 왼쪽 정렬 (- 사용)
print("[%-10s]" % "hello")    # 출력결과: [hello     ]
print("[%-10d]" % 123)        # 출력결과: [123       ]

# 0으로 채우기
print("[%05d]" % 42)          # 출력결과: [00042]
print("[%08.2f]" % 3.14)      # 출력결과: [00003.14]

3.2 방법 2: format() 함수 사용

Python 2.6+에서 도입된 더 유연한 포맷팅 방법입니다.

기본 사용법:

# 위치 인자
print("My name is {}, I'm {} years old".format("박수진", 10))
# 출력결과: My name is 박수진, I'm 10 years old

# 인덱스 지정
print("{0}와 {1}".format("사과", "배"))
# 출력결과: 사과와 배

print("{1}와 {0}".format("사과", "배"))
# 출력결과: 배와 사과

# 동일 인덱스 반복
print("{0} {0} {1}".format("hello", "world"))
# 출력결과: hello hello world

키워드 인자:

print("My name is {name}, I'm {age} years old".format(name="박수진", age=10))
# 출력결과: My name is 박수진, I'm 10 years old

# 딕셔너리 언패킹
person = {"name": "홍길동", "age": 30}
print("이름: {name}, 나이: {age}".format(**person))
# 출력결과: 이름: 홍길동, 나이: 30

숫자 포맷팅:

import math
PI = math.pi

print("PI = {}".format(PI))
# 출력결과: PI = 3.141592653589793

print("PI = {:.3f}".format(PI))
# 출력결과: PI = 3.142

print("PI = {:.1f}".format(PI))
# 출력결과: PI = 3.1

# 천단위 구분자
print("{:,}".format(1234567890))
# 출력결과: 1,234,567,890

# 퍼센트 표시
print("{:.2%}".format(0.25))
# 출력결과: 25.00%

# 진법 변환
num = 255
print("10진수: {:d}".format(num))   # 출력결과: 10진수: 255
print("2진수: {:b}".format(num))    # 출력결과: 2진수: 11111111
print("8진수: {:o}".format(num))    # 출력결과: 8진수: 377
print("16진수: {:x}".format(num))   # 출력결과: 16진수: ff
print("16진수: {:X}".format(num))   # 출력결과: 16진수: FF

정렬과 채우기:

# 기본 정렬 (오른쪽)
print("[{:10}]".format("hello"))     # 출력결과: [hello     ]
print("[{:10d}]".format(123))        # 출력결과: [       123]

# 왼쪽 정렬 (<)
print("[{:<10}]".format("hello"))    # 출력결과: [hello     ]

# 오른쪽 정렬 (>)
print("[{:>10}]".format("hello"))    # 출력결과: [     hello]

# 가운데 정렬 (^)
print("[{:^10}]".format("hello"))    # 출력결과: [  hello   ]

# 특정 문자로 채우기
print("[{:*^10}]".format("hello"))   # 출력결과: [**hello***]
print("[{:-<10}]".format("hello"))   # 출력결과: [hello-----]
print("[{:0>10}]".format(123))       # 출력결과: [0000000123]

3.3 방법 3: f-string (Python 3.6+) - 권장

가장 현대적이고 가독성이 좋은 포맷팅 방법입니다.

기본 사용법:

name = "Python"
version = 3.11

print(f"Language: {name}, Version: {version}")
# 출력결과: Language: Python, Version: 3.11

# 표현식 사용 가능
a = 10
b = 20
print(f"{a} + {b} = {a + b}")
# 출력결과: 10 + 20 = 30

# 함수 호출
text = "hello"
print(f"대문자: {text.upper()}")
# 출력결과: 대문자: HELLO

숫자 포맷팅:

import math
PI = math.pi

print(f'원주율은 {PI} 입니다')
# 출력결과: 원주율은 3.141592653589793 입니다

print(f'원주율은 {PI:.2f} 입니다')
# 출력결과: 원주율은 3.14 입니다

print(f'원주율은 {PI:.4f} 입니다')
# 출력결과: 원주율은 3.1416 입니다

# 천단위 구분자
price = 1234567890
print(f"가격: {price:,}원")
# 출력결과: 가격: 1,234,567,890원

# 퍼센트
ratio = 0.7568
print(f"비율: {ratio:.1%}")
# 출력결과: 비율: 75.7%

정렬:

name = "Python"
print(f"[{name:10}]")     # 출력결과: [Python    ]
print(f"[{name:<10}]")    # 출력결과: [Python    ]
print(f"[{name:>10}]")    # 출력결과: [    Python]
print(f"[{name:^10}]")    # 출력결과: [  Python  ]
print(f"[{name:*^10}]")   # 출력결과: [**Python**]

디버깅 (Python 3.8+):

x = 10
y = 20
print(f"{x=}, {y=}")
# 출력결과: x=10, y=20

print(f"{x + y = }")
# 출력결과: x + y = 30

4. 서식 지정자 표

4.1 기본 서식 지정자 (% 연산자)

서식 지정자 설명 예제 출력
%s 문자열 (String) "%s" % "hello" hello
%d 십진수 정수 (Decimal Integer) "%d" % 42 42
%i 정수 (%d와 동일) "%i" % 42 42
%f 부동소수점 실수 (Float) "%f" % 3.14 3.140000
%e 지수 표기법 (소문자) "%e" % 1234.5 1.234500e+03
%E 지수 표기법 (대문자) "%E" % 1234.5 1.234500E+03
%g %f와 %e 중 짧은 것 "%g" % 0.00001 1e-05
%G %f와 %E 중 짧은 것 "%G" % 0.00001 1E-05
%c 단일 문자 (Character) "%c" % 65 A
%o 8진수 (Octal) "%o" % 8 10
%x 16진수 소문자 (Hexadecimal) "%x" % 255 ff
%X 16진수 대문자 "%X" % 255 FF
%% 퍼센트 문자 자체 "100%%" 100%

4.2 format() / f-string 서식 지정자

서식 설명 예제 출력
{:d} 정수 f"{42:d}" 42
{:f} 실수 (기본 6자리) f"{3.14:f}" 3.140000
{:.2f} 실수 (소수점 2자리) f"{3.14159:.2f}" 3.14
{:e} 지수 표기법 f"{1234:e}" 1.234000e+03
{:b} 2진수 f"{10:b}" 1010
{:o} 8진수 f"{10:o}" 12
{:x} 16진수 소문자 f"{255:x}" ff
{:X} 16진수 대문자 f"{255:X}" FF
{:,} 천단위 구분자 f"{1000000:,}" 1,000,000
{:.2%} 퍼센트 f"{0.25:.2%}" 25.00%
{:10} 너비 지정 f"{'hi':10}" hi
{:<10} 왼쪽 정렬 f"{'hi':<10}" hi
{:>10} 오른쪽 정렬 f"{'hi':>10}" hi
{:^10} 가운데 정렬 f"{'hi':^10}" hi
{:*^10} 채움 문자 지정 f"{'hi':*^10}" ****hi****
{:05d} 0으로 채우기 f"{42:05d}" 00042
{:+d} 부호 표시 f"{42:+d}" +42
{: d} 양수에 공백 f"{42: d}" 42

4.3 포맷팅 방법 비교

방법 도입 버전 장점 단점
% 연산자 초기 C언어 경험자에게 익숙 복잡한 포맷팅 어려움
format() 2.6 유연하고 강력함 코드가 다소 길어짐
f-string 3.6 가독성 최고, 표현식 지원 Python 3.6+ 필요

5. input() 함수

5.1 기본 사용법

input() 함수는 키보드로부터 입력을 받아 **항상 문자열(str)**로 반환합니다.

# 기본 입력
a = input()
print(a)
print(type(a))  # <class 'str'>

# 프롬프트 메시지와 함께 입력
name = input("이름을 입력하세요: ")
print(f"안녕하세요, {name}님!")
# 이름을 입력하세요: 홍길동
# 안녕하세요, 홍길동님!

5.2 숫자 입력 받기

input()은 항상 문자열을 반환하므로, 숫자 연산을 위해서는 형변환이 필요합니다.

# 잘못된 예시 - 문자열 연결됨
a = input("숫자 입력: ")  # 10 입력
print(a + 10)  # TypeError 발생!

# 올바른 예시 - 형변환 사용
a = input("숫자 입력: ")  # 10 입력
print(int(a) + 10)
# 출력결과: 20

# 한 줄로 처리
num = int(input("정수 입력: "))
print(num * 2)

# 실수 입력
height = float(input("키를 입력하시오 (cm): "))
print(f"당신의 키는 {height}cm 입니다.")

5.3 여러 값 입력받기 - split()

하나의 input()으로 여러 값을 입력받으려면 split() 메서드를 사용합니다.

기본 사용 (공백 구분):

# 잘못된 방법
a = input("3개 입력: ")  # "10 20 30" 입력
# a에는 "10 20 30"이라는 하나의 문자열이 저장됨

a, b, c = input("3개 입력: ")  # Error 발생!

# 올바른 방법 - split() 사용
a, b, c = input("3개 입력: ").split()
print(f'a={a}, b={b}, c={c}')
# 입력: 10 20 30
# 출력: a=10, b=20, c=30

특정 구분자 사용:

# 콜론(:)으로 구분
hour, minute, second = input("시:분:초 형식입력: ").split(":")
print(f'hour={hour} minute={minute} second={second}')
# 입력: 2:22:54
# 출력: hour=2 minute=22 second=54

# 쉼표(,)로 구분
name, age, city = input("이름,나이,도시 입력: ").split(",")
print(f"이름: {name}, 나이: {age}, 도시: {city}")
# 입력: 홍길동,25,서울
# 출력: 이름: 홍길동, 나이: 25, 도시: 서울

# 하이픈(-)으로 구분
year, month, day = input("날짜 입력 (YYYY-MM-DD): ").split("-")
print(f"{year}년 {month}월 {day}일")
# 입력: 2024-01-15
# 출력: 2024년 01월 15일

5.4 입력값 변환하기 - map()

split()으로 나눈 값들은 여전히 문자열입니다. 숫자 연산을 위해 map() 함수를 사용합니다.

문제 상황:

# split()만 사용 - 문자열 상태
a, b, c = input("3개의 정수 입력: ").split()
print(a, b, c)
print(a + b + c)
# 입력: 10 20 30
# 출력: 10 20 30
# 출력: 102030 (문자열 연결!)

map() 함수로 해결:

# map()을 사용하여 정수로 변환
a, b, c = map(int, input("3개의 정수 입력: ").split())
print(a, b, c)
print(a + b + c)
# 입력: 10 20 30
# 출력: 10 20 30
# 출력: 60 (정수 덧셈!)

# 실수로 변환
x, y, z = map(float, input("3개의 실수 입력: ").split())
print(f"합계: {x + y + z}")
# 입력: 1.5 2.5 3.0
# 출력: 합계: 7.0

5.5 리스트로 입력받기

개수가 정해지지 않은 여러 값을 리스트로 받을 수 있습니다.

# 문자열 리스트
words = input("단어들을 입력하세요: ").split()
print(words)
# 입력: apple banana cherry
# 출력: ['apple', 'banana', 'cherry']

# 정수 리스트
numbers = list(map(int, input("숫자들을 입력하세요: ").split()))
print(numbers)
print(f"합계: {sum(numbers)}")
# 입력: 1 2 3 4 5
# 출력: [1, 2, 3, 4, 5]
# 출력: 합계: 15

5.6 실전 예제

예제 1: 평균 계산

n = int(input())
total = sum(map(int, input().split()))
print("{:.2f}".format(total/n))

# 입력:
# 3
# 99 65 30

# 출력:
# 64.67

예제 2: 좌표 입력

x, y = map(int, input("좌표 입력 (x y): ").split())
print(f"입력한 좌표: ({x}, {y})")
print(f"원점으로부터 거리: {(x**2 + y**2)**0.5:.2f}")

# 입력: 3 4
# 출력: 입력한 좌표: (3, 4)
# 출력: 원점으로부터 거리: 5.00

예제 3: 학생 성적 처리

n = int(input("학생 수: "))
scores = []

for i in range(n):
    name, score = input(f"{i+1}번째 학생 (이름 점수): ").split()
    scores.append((name, int(score)))

print("\n=== 성적표 ===")
for name, score in scores:
    print(f"{name}: {score}점")

avg = sum(score for _, score in scores) / n
print(f"평균: {avg:.1f}점")

요약

기능 사용법 예제
기본 출력 print() print("Hello")
줄바꿈 없이 출력 print(..., end='') print("Hi", end='')
구분자 변경 print(..., sep=',') print(1, 2, 3, sep=',')
Raw String r"문자열" r"C:\Users"
% 포맷팅 "... %s" % 값 "%s님" % "홍길동"
format() "...{}".format(값) "{}님".format("홍길동")
f-string f"...{변수}" f"{name}님"
기본 입력 input() a = input()
숫자 입력 int(input()) n = int(input())
여러 값 입력 input().split() a, b = input().split()
숫자 여러 개 map(int, input().split()) a, b = map(int, input().split())

참고 자료