(이 글은 파이썬 2.7.12 버전을 기준으로 작성하였습니다.)


여러 문자열을 합치거나 변수와 함께 출력하고자 할 떄 포맷팅을 사용합니다.


그 방법에는 여러 가지가 있을 것입니다.


print "Hello %s" % "World"
print "Hello {}".format("World")
print " ".join("Hello", "World")
print "Hello " + "World"


저는 주로 .format() 을 주로 사용하고 % 를 이용한 포맷팅은 가끔씩 사용합니다.


왜 파이썬에서는 이렇게 여러 방법을 혼용할까요. 사람 헷갈리게.


그 이유는 파이썬 2.5 버전부터  .format()이라는 new syntax가 추가되었기 때문이라고 합니다.


그렇다면 저 둘 중 무엇을 사용하는 것이 좋을까해서 구글링을 해보았더니 명확한 답은 찾을 수 없었습니다.


성능 같은 경우에는 상황에 따라 서로 바뀌기도 하고 .format()은 되지만 % 라는 것도 딱히 보지 못하였습니다. 방법이 다를 뿐 구현은 할 수 있더군요.


결과적으로 답은 못 찾았지만 대신 흥미로운 것들을 알 수 있었습니다.


대표적으로 이런 것들이 있겠네요


li = [12,45,78,784,2,69,1254,4785,984]
print map('the number is {}'.format,li)

print map('some_format_string_%s'.__mod__, some_iterable)


from datetime import datetime,timedelta

once_upon_a_time = datetime(2010, 7, 1, 12, 0, 0)
delta = timedelta(days=13, hours=8,  minutes=20)

gen =(once_upon_a_time +x*delta for x in xrange(20))

print '\n'.join(map('{:%Y-%m-%d %H:%M:%S}'.format, gen))



이런 예시도 있었습니다. 이 예시는 가독성 문제 때문에 .format()에 힘을 실어주는 글이었습니다.


# name 은 (1, 2, 3) 같은 튜플입니다
print "hi there %s" % (name,)   # supply the single argument as a single-item tuple
print "hi there {}".format(name)



어쨌든 제가 내린 결론은 둘 중 어느 방법을 사용하던지 중요한 것은 가독성이라고 생각합니다. 성능이나 구현하는 기능이 그렇게 다르지 않다면요.


결국 이것도 코딩 스타일 중 하나이니까요. 즉, 굳이 특정 방법을 고집할 필요는 없을 것 같습니다.



PS1. timeit 이라는 모듈이 있는데 이걸 이용해서 함수의 처리 시간을 알려주는 것도 있더군요. a라는 함수가 있을 떄 timeit.timeit(a) 와 같이 간단하게 사용할 수 있습니다.


PS2. 로그를 찍을 때 logger 모듈을 사용하는데 포맷팅을 하지 않고 함수에 인자를 전달해서 사용할 수 있습니다.


log.debug("some debug info: %s", some_info)



참고


http://stackoverflow.com/questions/5082452/python-string-formatting-vs-format


http://stackoverflow.com/questions/6960442/difference-between-python-print-format-methods

블로그 이미지

NCookie

,