본문 바로가기

PYTHON

[Python / 파이썬] format(), f", f-string, 포맷 문자열 리터럴, 포맷함수

입력과 출력

프로그램의 출력을 표현하는 여러 가지 방법이 있습니다; 사람이 일기에 적합한 형태로 데이터를 인쇄할 수도 있고, 나중에 사용하기 위해 파일에 쓸 수도 있습니다. 이 장에서는 몇 가지 가능성을 논합니다.

장식적인 출력 포매팅

지금까지 우리는 값을 쓰는 두 가지 방법을 만났습니다: 표현식 문장  print() 함수입니다. (세 번째 방법은 파일 객체의 write() 메서드를 사용하는 것입니다; 표준 출력 파일은 sys.stdout 로 참조할 수 있습니다. 이것에 대한 자세한 정보는 라이브러리 레퍼런스를 보세요.)

종종 단순히 스페이스로 구분된 값을 인쇄하는 것보다 출력 형식을 더 많이 제어해야 하는 경우가 있습니다. 출력을 포맷하는 데는 여러 가지 방법이 있습니다.

포맷 문자열 리터럴을 사용하려면, 시작 인용 부호 또는 삼중 인용 부호 앞에 f 또는 F 를 붙여 문자열을 시작하십시오. 이 문자열 안에서, {  } 문자 사이에, 변수 또는 리터럴 값을 참조할 수 있는 파이썬 표현식을 작성할 수 있습니다.

>>>>>> year = 2016 
>>> event = 'Referendum' 
>>> f'Results of the {year} {event}' 
'Results of the 2016 Referendum'

문자열의 str.format() 메서드는 더 많은 수작업을 요구합니다. 변수가 대체 될 위치를 표시하기 위해 {  }를 여전히 사용하고, 자세한 포매팅 디렉티브를 제공할 수 있지만, 포맷할 정보도 제공해야 합니다.

>>>>>> yes_votes = 42_572_654 
>>> no_votes = 43_132_495 
>>> percentage = yes_votes / (yes_votes + no_votes) 
>>> '{:-9} YES votes {:2.2%}'.format(yes_votes, percentage) 
' 42572654 YES votes 49.67%'

마지막으로, 문자열 슬라이싱 및 이어붙이기 연산을 사용하여 상상할 수 있는 모든 배치를 만듦으로써, 모든 문자열 처리를 스스로 수행할 수 있습니다. 문자열형에는 주어진 열 너비로 문자열을 채우는 데 유용한 연산을 수행하는 몇 가지 메서드가 있습니다.

장식적인 출력이 필요하지 않고 단지 디버깅을 위해 일부 변수를 빠르게 표시하려면, repr() 또는 str() 함수를 사용하여 모든 값을 문자열로 변환할 수 있습니다.

str() 함수는 어느 정도 사람이 읽기에 적합한 형태로 값의 표현을 돌려주게 되어있습니다. 반면에 repr() 은 인터프리터에 의해 읽힐 수 있는 형태를 만들게 되어있습니다 (또는 그렇게 표현할 수 있는 문법이 없으면 SyntaxError 를 일으키도록 구성됩니다). 사람이 소비하기 위한 특별한 표현이 없는 객체의 경우, str()  repr()과 같은 값을 돌려줍니다. 많은 값, 숫자들이나 리스트와 딕셔너리와 같은 구조들, 은 두 함수를 쓸 때 같은 표현을 합니다. 특별히, 문자열은 두 가지 표현을 합니다.

몇 가지 예를 듭니다:

>>>>>> s = 'Hello, world.' 
>>> str(s) 'Hello, world.' 
>>> repr(s) "'Hello, world.'" 
>>> str(1/7) '0.14285714285714285' 
>>> x = 10 * 3.25 >>> y = 200 * 200 
>>> s = 'The value of x is ' + repr(x) + ', and y is ' + repr(y) + '...' 
>>> print(s) The value of x is 32.5, and y is 40000... 
>>> # The repr() of a string adds string quotes and backslashes: 
... hello = 'hello, world\n' 
>>> hellos = repr(hello) >>> print(hellos) 'hello, world\n' 
>>> # The argument to repr() may be any Python object: 
... repr((x, y, ('spam', 'eggs'))) 
"(32.5, 40000, ('spam', 'eggs'))"

string 모듈에는 문자열에 값을 치환하는 또 다른 방법을 제공하는 Template 클래스가 포함되어 있습니다. $x와 같은 자리 표시자를 사용하고 이것들을 딕셔너리에서 오는 값으로 치환하지만, 포매팅에 대한 제어를 훨씬 덜 제공합니다.

포맷 문자열 리터럴 (f-string)

포맷 문자열 리터럴(간단히 f-문자열이라고도 합니다)은 문자열에 f 또는 F 접두어를 붙이고 표현식을 {expression}로 작성하여 문자열에 파이썬 표현식의 값을 삽입할 수 있게 합니다.

선택적인 포맷 지정자가 표현식 뒤에 올 수 있습니다. 이것으로 값이 포맷되는 방식을 더 정교하게 제어할 수 있습니다. 다음 예는 원주율을 소수점 이하 세 자리로 반올림합니다.

>>>>>> import math 
>>> print(f'The value of pi is approximately {math.pi:.3f}.') 
The value of pi is approximately 3.142.

':' 뒤에 정수를 전달하면 해당 필드의 최소 문자 폭이 됩니다. 열을 줄 맞춤할 때 편리합니다.

>>>>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678} 
>>> for name, phone in table.items(): 
... print(f'{name:10} ==> {phone:10d}') 
... 
Sjoerd 	==> 	4127 
Jack 	==> 	4098 
Dcab	==> 	7678

다른 수정자를 사용하면 포맷되기 전에 값을 변환할 수 있습니다. '!a' ascii()를, '!s' str()을, '!r' repr()을 적용합니다.:

>>>>>> animals = 'eels' 
>>> print(f'My hovercraft is full of {animals}.') 
My hovercraft is full of eels. 
>>> print(f'My hovercraft is full of {animals!r}.') 
My hovercraft is full of 'eels'.

이러한 포맷 사양에 대한 레퍼런스는 포맷 명세 미니 언어에 대한 레퍼런스 지침서를 참조하십시오.

문자열 format() 메서드

str.format() 메서드의 기본적인 사용법은 이런 식입니다:

>>>>>> print('We are the {} who say "{}!"'.format('knights', 'Ni')) 
We are the knights who say "Ni!"

중괄호와 그 안에 있는 문자들 (포맷 필드라고 부른다) 은 str.format() 메서드로 전달된 객체들로 치환됩니다. 중괄호 안의 숫자는 str.format() 메서드로 전달된 객체들의 위치를 가리키는데 사용될 수 있습니다.

>>>>>> print('{0} and {1}'.format('spam', 'eggs')) 
spam and eggs 
>>> print('{1} and {0}'.format('spam', 'eggs')) 
eggs and spam

str.format() 메서드에 키워드 인자가 사용되면, 그 값들은 인자의 이름을 사용해서 지정할 수 있습니다.

>>>>>> print('This {food} is {adjective}.'.format( 
... 	food='spam', adjective='absolutely horrible')) 
This spam is absolutely horrible.

위치와 키워드 인자를 자유롭게 조합할 수 있습니다:

>>>>>> print('The story of {0}, {1}, and {other}.'.format('Bill', 'Manfred', other='Georg')) 
The story of Bill, Manfred, and Georg.

나누고 싶지 않은 정말 긴 포맷 문자열이 있을 때, 포맷할 변수들을 위치 대신에 이름으로 지정할 수 있다면 좋을 것입니다. 간단히 딕셔너리를 넘기고 키를 액세스하는데 꺾쇠괄호 '[]' 를 사용하면 됩니다

>>>>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678} 
>>> print('Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d}; ' 
... 	  'Dcab: {0[Dcab]:d}'.format(table)) 
Jack: 4098; Sjoerd: 4127; Dcab: 8637678

'**' 표기법을 사용해서 table을 키워드 인자로 전달해도 같은 결과를 얻을 수 있습니다.

>>>>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678} 
>>> print('Jack: {Jack:d}; Sjoerd: {Sjoerd:d}; Dcab: {Dcab:d}'.format(**table)) 
Jack: 4098; Sjoerd: 4127; Dcab: 8637678

이 방법은 모든 지역 변수들을 담은 딕셔너리를 돌려주는 내장 함수 vars() 와 함께 사용할 때 특히 쓸모가 있습니다.

예를 들어, 다음 줄은 정수와 그 제곱과 세제곱을 제공하는 빽빽하게 정렬된 열 집합을 생성합니다:

>>>>>> for x in range(1, 11): 
... 	print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x)) 
... 
1 1 1 
2 4 8 
3 9 27 
4 16 64 
5 25 125  
6 36 216 
7 49 343 
8 64 512 
9 81 729 
10 100 1000