티스토리 뷰

반응형

[※ 주의 ※] 아래를 이해하지 않고 이 글을 볼 경우, 이해가 되지 않는 부분이 있을 수 있습니다.

 

1. [Python] 출력 함수 print()에 관한 모든 것 1


지난 글에는 print 함수의 간략한 개요 및 매개변수들에 관하여 알아보았다.

 

이번 포스팅은 print의 함수적인 측면을 조금 더 보려고 한다.

print문에 대하여 더 알아보자.

1. print의 변화

파이썬 2.7에서 파이썬 3으로의 업그레이드에서, print의 사용 방식에 변화가 생겼다.

 

파이썬 2.7.x 버전까지는 print는 하나의 구문으로 사용되었다.

 

1
2
3
4
5
6
7
8
print 'Python', python_version()
# Python 2.7
print 'Hello, World!'
# Hello, World!
print("Hello, World!")
# Hello, World!
print "text", ; print 'print more text'
# text print more text
cs

 

파이썬 3부터는 print는 하나의 함수처럼 다루어졌으며, 우리가 알고 있는 방식으로 print문은 변화하였다.

 

이러한 함수로의 변화의 이유는 크게 두 가지를 꼽을 수 있다.

 

먼저, print가 함수가 됨에 따라 구문의 유지 및 보수가 쉬워졌고, 가독성이 높아졌다. 파이썬 3.3에서 flush 매개변수가 추가된것처럼 함수화하면 구문 변경 및 변화가 쉬워지고, 차후 업데이트에서 쉽게 작업할 수 있기 때문이다.


두 번째는 파이썬의 특징과 관련이 있다.

 

파이썬 내부에서는 함수도 하나의 일급 객체(First-class objects)로 취급한다. 쉽게 말해, 함수를 변수에 할당할 수 있고, 인자로 전달할 수 있고, 다른 함수의 결과로 반환할 수 있다는 것이다. 즉, 함수를 하나의 자료형 다루듯이 가능하다는 것이다.

 

print 함수도 예외는 아니다. 다음과 같이 함수를 인자 넘겨줄 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
def scan(directory, log = print):
    log(f"Scanning {directory}...")
    print("Finished!")
 
def custom_print(*args):
    print(*args, end = ' ')
 
scan('/root/file1.txt', log = custom_print)
scan('/root/file2.txt', log = custom_print)
# Scanning /root/file1.txt... Finished!
# Scanning /root/file2.txt... Finished!
cs

 

위의 예시에서 log로 함수를 넘겨주고, 기본값으로는 print 함수를 사용한 것을 알 수 있다. 일급 객체에 대한 설명은 다른 포스팅으로 남기겠다.

 

또한, 함수는 구문과 달리 하나의 값이기 때문에, 람다표현식과 같은 표현식과 섞어 사용할 수 있다.

 

1
2
3
4
5
def scan(directory, log=print):
    log(f"Scanning {directory}...")
 
scan('/root/file1.txt', log=lambda msg : print("[INFO]", msg))
# [INFO] Scanning /root/file1.txt...
cs

 

또한, 함수형 프로그래밍(Functional programming)을 print에서도 적용할 수 있다. functools 모듈의 partial 함수를 활용하여 다음과 같이 에러 메시지를 띄우는 코드를 작성할 수 있다.

 

1
2
3
4
5
6
7
8
from functools import partial
import sys
 
redirect = lambda f, stream: partial(f, file = stream)
prefix = lambda f, pre: partial(f, pre)
err = prefix(redirect(print, sys.stderr), '[ERROR]')
err("404: file not found")
# [ERROR] 404: file not found
cs

 

함수형 프로그래밍에 대한 글은 아니기에 특별한 설명을 하진 않겠다.

 

만약 파이썬 3에서 print가 함수로 변하지 않고 구문으로 남아있었다면, 이러한 활용은 불가능했을 것이다.

 

위의 내용들이 파이썬이 print에 대한 과감한 변화를 선택한 이유에 대한 답변이 되리라 생각한다.


만약, 파이썬 2.7x 미만에서 print를 구문 대신 함수처럼 사용하고 싶다면, __future__에 있는 'print_function'을 사용하면 된다.

 

1
2
3
4
5
from __future__ import print_function
import sys
 
print('I am a function in Python', sys.version_info.major)
# I am a function in Python 2
cs

 

 

 

반응형
댓글
Total
Today
Yesterday
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함