(이 글은 파이썬 2.7.12 버전을 기준으로 작성하였습니다.)
여러 문자열을 합치거나 변수와 함께 출력하고자 할 떄 포맷팅을 사용합니다.
그 방법에는 여러 가지가 있을 것입니다.
1
2
3
4
print "Hello %s" % "World"
print "Hello {}".format("World")
print " ".join("Hello", "World")
print "Hello " + "World"
저는 주로 .format() 을 주로 사용하고 % 를 이용한 포맷팅은 가끔씩 사용합니다.
왜 파이썬에서는 이렇게 여러 방법을 혼용할까요. 사람 헷갈리게.
그 이유는 파이썬 2.5 버전부터 .format()이라는 new syntax가 추가되었기 때문이라고 합니다.
그렇다면 저 둘 중 무엇을 사용하는 것이 좋을까해서 구글링을 해보았더니 명확한 답은 찾을 수 없었습니다.
성능 같은 경우에는 상황에 따라 서로 바뀌기도 하고 .format()은 되지만 % 라는 것도 딱히 보지 못하였습니다. 방법이 다를 뿐 구현은 할 수 있더군요.
결과적으로 답은 못 찾았지만 대신 흥미로운 것들을 알 수 있었습니다.
대표적으로 이런 것들이 있겠네요
1
2
3
4
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)
1
2
3
4
5
6
7
8
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()에 힘을 실어주는 글이었습니다.
1
2
3
# 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 모듈을 사용하는데 포맷팅을 하지 않고 함수에 인자를 전달해서 사용할 수 있습니다.
참고
http://stackoverflow.com/questions/5082452/python-string-formatting-vs-format
http://stackoverflow.com/questions/6960442/difference-between-python-print-format-methods
'파이썬' 카테고리의 다른 글
sqlite3 AttributeError: 'module' object has no attribute 'connect' (0) | 2016.12.20 |
---|---|
[파이썬] socketserver 모듈을 이용하여 채팅 프로그램 만들기(3) (0) | 2016.12.07 |
[파이썬] socketserver 모듈을 이용하여 채팅 프로그램 만들기(2) (0) | 2016.12.04 |
[파이썬] socketserver 모듈을 이용하여 채팅 프로그램 만들기(1) (0) | 2016.12.04 |
[파이썬] 여러 개의 정수를 공백 단위로 입력받기 (0) | 2016.11.30 |