print 함수로 여러 변수를 출력할 때 자동으로 공백이 들어가는 것이 불편하신가요? 변수들을 붙여서 출력하거나, 구분자를 커스터마이징하고 싶으신가요? 이 글에서는 print 함수의 sep 매개변수와 다양한 출력 포맷팅 방법을 완벽하게 알려드립니다.
print 함수의 기본 동작
기본 공백 출력
# 기본적으로 변수 사이에 공백이 자동 삽입
name = "홍길동"
age = 25
city = "서울"
print(name, age, city)
# 출력: 홍길동 25 서울
# 자동으로 공백이 들어감
기본 동작: print는 여러 인자 사이에 자동으로 공백(space)을 넣습니다.
sep 매개변수로 구분자 변경
공백 제거 (붙여서 출력)
name = "Python"
version = 3
year = 2025
# 기본 출력 (공백 있음)
print(name, version, year)
# Python 3 2025
# sep='' 로 공백 제거
print(name, version, year, sep='')
# Python32025
# 실용 예제
print("총", 100, "개", sep='')
# 총100개
sep=’’: 구분자를 빈 문자열로 설정하면 공백 없이 붙여서 출력됩니다.
다양한 구분자 사용
# 쉼표로 구분
print("사과", "바나나", "포도", sep=', ')
# 사과, 바나나, 포도
# 대시로 구분
print("2025", "10", "08", sep='-')
# 2025-10-08
# 슬래시로 구분
print("홍길동", "개발자", "서울", sep=' / ')
# 홍길동 / 개발자 / 서울
# 줄바꿈으로 구분
print("첫째", "둘째", "셋째", sep='\\\\n')
# 첫째
# 둘째
# 셋째
# 탭으로 구분
print("이름", "나이", "직업", sep='\\\\t')
# 이름 나이 직업
실전 활용 예제
# 파일 경로 생성
folder = "documents"
subfolder = "reports"
filename = "2025.txt"
print(folder, subfolder, filename, sep='/')
# documents/reports/2025.txt
# 전화번호 포맷
area = "010"
middle = "1234"
last = "5678"
print(area, middle, last, sep='-')
# 010-1234-5678
# URL 생성
domain = "example.com"
path = "api"
endpoint = "users"
print("https://", domain, "/", path, "/", endpoint, sep='')
# <https://example.com/api/users>
# CSV 형식
name = "홍길동"
age = 28
job = "개발자"
print(name, age, job, sep=',')
# 홍길동,28,개발자
end 매개변수로 줄바꿈 제어
줄바꿈 제거
# 기본 출력 (자동 줄바꿈)
print("첫 번째")
print("두 번째")
# 첫 번째
# 두 번째
# end='' 로 줄바꿈 제거
print("첫 번째", end='')
print("두 번째")
# 첫 번째두 번째
# 공백으로 연결
print("첫 번째", end=' ')
print("두 번째")
# 첫 번째 두 번째
진행률 표시
import time
# 같은 줄에 계속 출력
for i in range(1, 101):
print(f"\\\\r진행률: {i}%", end='')
time.sleep(0.05)
print() # 마지막에 줄바꿈
# 진행률: 100%
\r (캐리지 리턴): 커서를 줄 처음으로 이동해 덮어쓰기
로딩 애니메이션
import time
loading_chars = ['|', '/', '-', '\\\\\\\\']
for i in range(20):
print(f"\\\\r처리 중... {loading_chars[i % 4]}", end='')
time.sleep(0.2)
print("\\\\n완료!")
# 처리 중... | (회전하는 애니메이션)
# 완료!
sep와 end 동시 사용
# sep와 end 조합
print("Python", 3.12, sep='', end=' | ')
print("Django", 5.0, sep='', end=' | ')
print("Flask", 3.0, sep='')
# Python3.12 | Django5.0 | Flask3.0
# 한 줄 테이블
print("이름", "나이", "직업", sep='\\\\t', end='\\\\n')
print("홍길동", 28, "개발자", sep='\\\\t', end='\\\\n')
print("김철수", 32, "디자이너", sep='\\\\t')
# 이름 나이 직업
# 홍길동 28 개발자
# 김철수 32 디자이너
포맷팅 방법 비교
1. f-string (Python 3.6+, 권장)
name = "홍길동"
age = 28
city = "서울"
# 공백 제어가 자유로움
print(f"{name}{age}{city}")
# 홍길동28서울
print(f"{name} {age} {city}")
# 홍길동 28 서울
print(f"{name}, {age}세, {city}")
# 홍길동, 28세, 서울
# 표현식 포함
print(f"{name}님은 {age+2}년 후 {age+2}세가 됩니다")
# 홍길동님은 2년 후 30세가 됩니다
장점: 가장 직관적이고 강력함
2. % 포맷팅 (레거시)
name = "홍길동"
age = 28
# 공백 없이
print("%s%d" % (name, age))
# 홍길동28
# 공백 포함
print("%s %d" % (name, age))
# 홍길동 28
# 포맷 지정
print("%s님은 %d세입니다" % (name, age))
# 홍길동님은 28세입니다
3. str.format()
name = "홍길동"
age = 28
# 공백 없이
print("{}{}".format(name, age))
# 홍길동28
# 공백 포함
print("{} {}".format(name, age))
# 홍길동 28
# 인덱스 지정
print("{0}님은 {1}세, {0}은 개발자".format(name, age))
# 홍길동님은 28세, 홍길동은 개발자
# 이름 지정
print("{name}님은 {age}세입니다".format(name=name, age=age))
# 홍길동님은 28세입니다
4. 문자열 연결 (+)
name = "홍길동"
age = 28
# 타입 변환 필요
print(name + str(age))
# 홍길동28
# 공백 추가
print(name + " " + str(age))
# 홍길동 28
# 복잡한 문자열
print(name + "님은 " + str(age) + "세입니다")
# 홍길동님은 28세입니다
단점: 타입 변환이 번거롭고 가독성이 떨어짐
실전 활용 예제
예제 1: 테이블 형식 출력
# 헤더
print("이름", "나이", "직업", "도시", sep='\\\\t')
print("-" * 40)
# 데이터
data = [
("홍길동", 28, "개발자", "서울"),
("김철수", 32, "디자이너", "부산"),
("이영희", 25, "기획자", "대전")
]
for row in data:
print(*row, sep='\\\\t')
# 출력:
# 이름 나이 직업 도시
# ----------------------------------------
# 홍길동 28 개발자 서울
# 김철수 32 디자이너 부산
# 이영희 25 기획자 대전
- row: 튜플을 언패킹해 각 요소를 개별 인자로 전달
예제 2: CSV 파일 생성
# CSV 형식으로 출력
print("이름,나이,이메일")
users = [
("홍길동", 28, "hong@example.com"),
("김철수", 32, "kim@example.com"),
("이영희", 25, "lee@example.com")
]
for user in users:
print(*user, sep=',')
# 출력:
# 이름,나이,이메일
# 홍길동,28,hong@example.com
# 김철수,32,kim@example.com
# 이영희,25,lee@example.com
# 파일로 저장
with open('users.csv', 'w', encoding='utf-8') as f:
print("이름,나이,이메일", file=f)
for user in users:
print(*user, sep=',', file=f)
예제 3: 진행 상황 표시
import time
def download_simulation():
total = 100
for i in range(total + 1):
percent = i
bar = '█' * (i // 2)
spaces = ' ' * ((100 - i) // 2)
print(f"\\\\r[{bar}{spaces}] {percent}%", end='')
time.sleep(0.05)
print() # 완료 후 줄바꿈
download_simulation()
# [██████████████████████████████████████████████████] 100%
예제 4: 로그 메시지
from datetime import datetime
def log_message(level, message):
timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print('[', timestamp, ']', '[', level, ']', message, sep='')
# 사용
log_message('INFO', '프로그램 시작')
log_message('WARNING', '메모리 사용량 80% 초과')
log_message('ERROR', '데이터베이스 연결 실패')
# 출력:
# [2025-10-08 14:30:25][INFO]프로그램 시작
# [2025-10-08 14:30:26][WARNING]메모리 사용량 80% 초과
# [2025-10-08 14:30:27][ERROR]데이터베이스 연결 실패
예제 5: 파일 경로 생성
import os
def create_path(*parts):
"""여러 경로 요소를 결합"""
# Windows: \\\\, Linux/Mac: /
print(*parts, sep=os.sep)
# 사용
create_path('Users', 'username', 'Documents', 'project', 'data.txt')
# Windows: Users\\\\username\\\\Documents\\\\project\\\\data.txt
# Linux/Mac: Users/username/Documents/project/data.txt
# 또는 직접 지정
print('home', 'user', 'files', sep='/')
# home/user/files
예제 6: 태그 생성
def generate_html_tag(tag, content):
"""HTML 태그 생성"""
print('<', tag, '>', content, '</', tag, '>', sep='')
# 사용
generate_html_tag('h1', 'Welcome')
generate_html_tag('p', 'This is a paragraph')
generate_html_tag('a', 'Click here')
# 출력:
# <h1>Welcome</h1>
# <p>This is a paragraph</p>
# <a>Click here</a>
고급 활용
조건부 구분자
def print_list(items, compact=False):
"""리스트를 다양한 형식으로 출력"""
if compact:
print(*items, sep='')
else:
print(*items, sep=', ')
# 사용
fruits = ['사과', '바나나', '포도']
print_list(fruits, compact=False)
# 사과, 바나나, 포도
print_list(fruits, compact=True)
# 사과바나나포도
동적 구분자
def print_with_separator(items, separator=' | '):
"""커스텀 구분자로 출력"""
print(*items, sep=separator)
# 사용
data = ['Python', 'Django', 'Flask', 'FastAPI']
print_with_separator(data)
# Python | Django | Flask | FastAPI
print_with_separator(data, separator=' → ')
# Python → Django → Flask → FastAPI
print_with_separator(data, separator='\\\\n- ')
# Python
# - Django
# - Flask
# - FastAPI
정렬된 출력
def print_aligned(label, value, width=20):
"""레이블과 값을 정렬해서 출력"""
print(f"{label:<{width}}", value, sep=': ')
# 사용
print_aligned('이름', '홍길동')
print_aligned('나이', 28)
print_aligned('이메일', 'hong@example.com')
print_aligned('전화번호', '010-1234-5678')
# 출력:
# 이름 : 홍길동
# 나이 : 28
# 이메일 : hong@example.com
# 전화번호 : 010-1234-5678
성능 비교
import time
# 1. print with sep
start = time.time()
for i in range(100000):
print('a', 'b', 'c', sep='', end='')
print()
print(f"sep 방식: {time.time() - start:.4f}초")
# 2. f-string
start = time.time()
for i in range(100000):
print(f"{'a'}{'b'}{'c'}", end='')
print()
print(f"f-string: {time.time() - start:.4f}초")
# 3. 문자열 연결
start = time.time()
for i in range(100000):
print('a' + 'b' + 'c', end='')
print()
print(f"문자열 연결: {time.time() - start:.4f}초")
결과: f-string이 가장 빠르고, sep 방식도 충분히 효율적
자주 하는 실수
실수 1: 타입 오류
# 잘못된 예
name = "홍길동"
age = 28
# print(name + age) # TypeError!
# 올바른 예
print(name, age) # sep 사용
# 홍길동 28
print(f"{name}{age}") # f-string 사용
# 홍길동28
print(name + str(age)) # 타입 변환
# 홍길동28
실수 2: sep 위치
# 잘못된 예
# print(sep='', "a", "b", "c") # SyntaxError!
# 올바른 예
print("a", "b", "c", sep='')
# abc
키워드 인자는 항상 마지막에
실수 3: 불필요한 변환
# 비효율적
x = 100
y = 200
print(str(x) + str(y))
# 효율적
print(x, y, sep='')
# 100200
# 더 나은 방법
print(f"{x}{y}")
# 100200
파일 출력
# 파일에 출력할 때도 sep 사용 가능
with open('output.txt', 'w', encoding='utf-8') as f:
print('Python', 3.12, 'Django', 5.0, sep=', ', file=f)
print('데이터', '분석', '머신러닝', sep=' | ', file=f)
# output.txt 내용:
# Python, 3.12, Django, 5.0
# 데이터 | 분석 | 머신러닝
마치며
print 함수의 sep='' 매개변수로 변수 사이의 공백을 제거하고, sep=', '로 구분자를 커스터마이징할 수 있습니다. end=''로 줄바꿈도 제어 가능하며, f-string과 조합하면 더욱 강력한 출력 포맷팅이 가능합니다.
테이블 형식 출력, CSV 생성, 로그 메시지, 진행률 표시 등 다양한 실무 상황에서 sep와 end를 활용해보세요. 가독성과 효율성을 동시에 높일 수 있습니다!
참고 자료
- Python 공식 문서 – print(): https://docs.python.org/3/library/functions.html#print
- PEP 3101 – Advanced String Formatting: https://peps.python.org/pep-3101/
- Python String Formatting Best Practices: https://realpython.com/python-string-formatting/