Python / print() / 출력하는 함수

Python의 print()는 값을 텍스트로 바꾸어 기본적으로 표준 출력에 쓰는 함수입니다. 여러 값 사이에는 공백을, 마지막에는 줄바꿈을 넣으며 sep·end·file·flush로 이 동작을 조절할 수 있습니다. 출력한 문장을 반환하는 함수는 아니며 반환값은 None입니다.

기본 출력과 따옴표

기본 형식은 print(*objects, sep=' ', end='\n', file=None, flush=False)입니다. *objects는 출력할 값을 여러 개 받을 수 있다는 뜻입니다. file을 지정하지 않으면 표준 출력 sys.stdout을 사용하므로 일반적으로 터미널이나 IDE의 실행 창에 표시됩니다. 정확한 인수 규칙은 print() 공식 문서를 참고합니다.

예제는 Python 3의 UTF-8 파일 print_example.py로 저장하고 python print_example.py로 실행합니다. 환경에 따라 python3을 사용하며, 각 예제는 파일 내용을 교체해 독립적으로 실행할 수 있습니다.

print("Hello")
print('Hello')
print("'Hello'")
print('"Hello"')
print("count", 3, True, None)

예상 결과:

Hello
Hello
'Hello'
"Hello"
count 3 True None

작은따옴표와 큰따옴표는 문자열을 만드는 같은 역할을 하며 그 경계는 출력되지 않습니다. 따옴표 자체를 출력하려면 예제처럼 다른 종류의 따옴표로 감쌀 수 있습니다. 여러 인수로 전달하면 문자열과 숫자를 +로 억지로 연결하지 않아도 됩니다. 인수 없이 print()를 호출하면 기본 줄바꿈만 출력합니다.

sep는 값 사이, end는 호출 끝

sep는 한 번의 호출에 전달한 값 사이에 들어가고, end는 그 호출의 마지막에 붙습니다. 줄바꿈을 없애려면 end=""를, 다음 출력과 공백으로 연결하려면 end=" "를 사용할 수 있습니다.

print("A", "B", sep="-", end=" | ")
print("C")
values = ["A", "B"]
print(values, sep="-")
print(*values, sep="-")
A-B | C
['A', 'B']
A-B

첫 번째 호출은 A-B | 까지만 쓰고 다음 호출의 C와 이어집니다. 리스트를 인수 하나로 주면 리스트의 표현이 출력되므로 sep가 리스트 내부를 바꾸지 않습니다. 항목을 각각 출력하려면 *values로 풀어 전달합니다. 기본값으로 돌아가려면 해당 옵션을 생략하면 됩니다.

출력 서식과 반환값은 구분합니다

소수 자리나 문장 배치는 print() 옵션만으로 해결하기보다 먼저 문자열을 만듭니다. 다음은 f-string 서식의 :.2f로 소수점 아래 두 자리를 표시합니다.

price = 12.5
quantity = 3
message = f"Total: {price * quantity:.2f}"
result = print(message)
print(result)
Total: 37.50
None

실제로 문장을 담은 변수는 message이며, result에는 출력 결과가 아니라 None이 들어갑니다. 함수가 계산 결과를 다른 코드에 전달해야 한다면 return을 사용하고, 화면에 보여 주는 일은 호출한 쪽에서 처리하도록 구분합니다. 표시를 두 자리로 맞추는 것과 원래 숫자 값의 정밀도를 바꾸는 것도 별개입니다.

file로 UTF-8 텍스트 파일에 쓰기

file에는 텍스트를 쓸 수 있는 파일 객체를 전달합니다. 다음 전체 예제는 임시 폴더 안의 report.txt를 쓰고 읽으므로 기존 파일을 덮어쓰지 않으며, 종료하면 임시 자료가 정리됩니다. 별도 패키지는 필요하지 않습니다.

from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as folder:
    path = Path(folder) / "report.txt"
    with path.open("w", encoding="utf-8") as output:
        print("Alpha", 10, file=output)
    with path.open("a", encoding="utf-8") as output:
        print("Beta", 20, file=output)
    print(path.read_text(encoding="utf-8"), end="")
Alpha 10
Beta 20

첫 번째 "w"는 새로 쓰기이고 기존 파일이 있으면 내용을 지웁니다. 두 번째 "a"는 뒤에 이어 쓰기입니다. with 블록을 벗어나면 파일이 닫히고, 마지막 출력에서 end=""를 써 파일에 이미 있는 줄바꿈을 추가하지 않았습니다. 실제 파일에 적용할 때는 경로·쓰기 권한과 파일 모드·인코딩을 먼저 확인합니다.

출력을 문자열로 모으기와 TypeError

StringIO는 메모리에서 텍스트 파일처럼 쓸 수 있는 객체입니다. 기존 출력 함수를 재사용해 문자열을 모을 때 file=output으로 전달하고, 닫기 전에 getvalue()로 값을 꺼냅니다. 단순히 문장 하나만 만들려면 f-string이 더 직접적입니다.

from io import BytesIO, StringIO

with StringIO() as output:
    print("A", "B", sep="-", file=output)
    text = output.getvalue()
print(repr(text))

try:
    print("A", "B", sep=1)
except TypeError:
    print("TypeError: sep")

with BytesIO() as output:
    try:
        print("text", file=output)
    except TypeError:
        print("TypeError: binary stream")
'A-B\n'
TypeError: sep
TypeError: binary stream

repr()로 보인 \n은 캡처된 줄바꿈입니다. sep와 end는 문자열 또는 기본값을 뜻하는 None이어야 하므로 숫자를 넣으면 오류가 납니다. 바이너리 스트림인 BytesIO도 print()의 텍스트 쓰기 대상이 아닙니다. 바이너리 데이터는 필요한 인코딩으로 바꿔 바이너리 쓰기 API를 사용합니다.

줄바꿈 없이 진행 상황을 표시할 때 flush

출력은 환경의 버퍼에 모였다가 전달될 수 있습니다. 특히 줄바꿈을 생략한 진행 표시나 파일·파이프 출력은 화면에 보이는 시점이 예상과 다를 수 있습니다. flush=True는 출력 대상에 버퍼 비우기를 요청합니다.

for number in range(3):
    print(number, end=" ", flush=True)
print("done")
0 1 2 done

예제의 최종 문자는 위와 같지만 실제 갱신 시점은 터미널·IDE·출력 대상에 따라 다릅니다. flush는 새 줄을 추가하거나 화면을 지우는 옵션이 아니며, 디스크에 영구 저장까지 보장하지도 않습니다. 단순 출력은 기본값을 쓰고 중간 갱신이 필요한 지점에서 선택적으로 지정합니다.