[Python] Format을 갖춘 문자열 만들기 : String Formatting Operator %, Method format()
Python 분석과 프로그래밍/Python 설치 및 기본 사용법 2017. 8. 12. 02:12지난번 포스팅에서는 파이썬 자료형식 중 '문자열(string)'에 특화된 내장 함수들인 다양한 문자열 메소드 (built-in string methods) 들에 대해서 알아보았습니다.
이번 포스팅에서는 문자열에 특화된 연산자, 메소드로서
- 형식을 갖춘 문자열을 만들어주는 연산자: %
- 형식을 갖춘 문자열을 만들어주는 메소드: format()
에 대해서 알아보겠습니다.
텐서플로우로 딥러닝 공부하다보면 제일 마지막 부근에 아래와 같은 모델 훈련 진행 경과를 확인하는 코드가 들어있습니다. 이번 포스팅이 보고 나면 아래의 코드가 무엇을 의미하는지 눈에 읽히기 시작할 것입니다. ^^
# 신경망 모델 학습 진행 경과 확인 python code print('Epoch:', '%04d' % (epoch + 1),
'Avg. cost =', '{:.3f}'.format(total_cost / total_batch))
|
처음에 문자열 형식(format)을 설정해주는 % 연산자와 format() 문자열 메소드를 봤었을 땐 생소하고, 해석이 안되서 좀 당황했었습니다. 그런데 파이썬 매뉴얼 보고 나서 의미를 파악하고 난 후, 그리고 요즘 텐서플로우로 딥러닝 공부하면서 코드를 자꾸 보다보니 이젠 익숙해지기도 하고, 많이 유용하다는 생각도 듭니다.
[ Python String Formatting Operator % and Method format() ]
간단한 예를 들어서 설명해보겠습니다.
(1) Format 을 갖춘 문자열을 만들어주는 연산자 (String Formatting Operator): % |
>>> "I am %s and %d years old" %('Mr.Hong', 40) 'I am Mr.Hong and 40 years old'
|
'%'의 뒤에 함께 사용할 수 있는, 문자열 형식을 지정해주는 symbol 들에는 아래와 같은 것들이 있습니다. 많이 사용할 만한 format symbol은 파란색으로 강조를 했습니다.
%와 함께 사용하는 형식 기호 (Format Symbol with %) |
변환 (Conversion) |
%c |
문자 (character) |
%s |
str() 메소드를 사용해서 문자열로 변환한 후 formatting |
%i |
부호가 있는 십진법 정수 (signed decimal integer) |
%d |
부호가 있는 십진법 정수 (signed decimal integer) |
%u |
부호가 없는 십진법 정수 (unsigned decimal integer) |
%o |
8진법 정수 (octal integer) |
%x |
소문자의 16진법 정수 (hexadecimal integer, lowercase letters) |
%X |
대문자의 16진법 정수 (hexadecimal integer, UPPERcase letters) |
%e |
소문자 'e'를 사용한 지수 표기 (exponential notation with lowercase 'e') |
%E |
대문자 'E'를 사용한 지수 표기 (exponential notation with UPPERcase 'E') |
%f |
부동소수형 실수 (floating point real number) |
%g |
%f(부동소수형 실수)와 %e (소문자 'e' 지수 표기) 의 단축형 표기 |
%G |
%f(부동소수형 실수)와 %E(대문자 'E' 지수 표기)의 단축형 표기 |
위의 Format Symbol을 사용하면 원하는 Format의 데이터가 아닐 경우 'TypeError' (예: TypeError: %d format: a number is required, not str) 가 납니다.
>>> "I am %s and %d years old" %('Mr.Hong', '40') # '40' is not a number, but a string Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: %d format: a number is required, not str
|
부호가 있는 십진법 정수를 나타내는 문자열 포맷 연산자인 %d 의 경우 아래의 "%04d" % (5) 처럼 '%'와 'd' 사이에 '0'과 '숫자'를 써주게 되면 => % ( ) 안의 십진수 정수가 만약 입력한 '숫자'(예에서는 '4') 만큼의 총 자리수보다 작다면 그 모자라는 만큼을 '0'으로 채워줍니다. 말로 설명하기가 쉽지 않은데요(^^;), 아래의 예시를 보면 이해가 쉬울 것 같습니다.
>>> "%04d" % (5) '0005' >>> "%04d" % (55) '0055' >>> "%04d" % (555) '0555' >>> "%04d" % (5555) '5555' >>> "%04d" % (55555) '55555'
|
부동소수형 실수를 나타내는 문자열 포맷 연산자인 %f 의 경우 아래의 "%.3f" % (0.5) 처럼 '%'와 'f' 사이에 점 '.'과 '숫자'를 써주게 되면 => % ( ) 안의 부동소수형 실수가 만약 입력한 '숫자' (예에서는 '3') 만큼의 총 소수점 자리수보다 작다면 뒷부분의 모자라는 만큼을 '0'으로 채워줍니다. 역시, 글로 설명을 들으면 어려운데요(^^;), 아래 예를 살펴보시기 바랍니다.
>>> "%.3f" % (5) '5.000' >>> "%.3f" % (0.5) '0.500' >>> "%.3f" % (0.55) '0.550' >>> "%.3f" % (0.555) '0.555' >>> "%.3f" % (0.5555) '0.555'
|
처음 시작할 때 예로 들었던 딥러닝 텐서플로우 코드의 말미에 있다는 파이썬 코드가 이제 눈어 들어올 것입니다. epoch 와 total_cost, total_batch 변수에 임의의 숫자를 넣어서 아래에 print 를 해보았습니다.
>>> print('Epoch:', '%04d' % (100), ... 'Avg. cost =', '{:.3f}'.format(10 / 1000)) Epoch: 0100 Avg. cost = 0.010
|
formatting operator % 를 사용한 lambda 함수와 map() 함수를 같이 사용하여 pandas DataFrame의 숫자형 변수의 소수점 자리수(decimal point format)를 지정, 변경할 수 있습니다.
In [1]: import pandas as pd In [2]: df = pd.DataFrame({'id': ['a', 'b', 'c', 'd'], ...: 'val': [1.045, 5.200, 0.051, 8.912]}) In [3]: df Out[3]: id val 0 a 1.045 1 b 5.200 2 c 0.051 3 d 8.912 In [4]: formater = lambda x:" %.2f" %(x) In [5]: df['val'] = df['val'].map(formater) In [6]: df Out[6]: id val 0 a 1.04 1 b 5.20 2 c 0.05 3 d 8.91 |
* map() 대신에 apply() 를 사용해도 결과는 동일합니다.
* map(), apply()로 해서 소수점 2자리수로 변경을 하면 float8 이 string 으로 데이터 유형이 변경됩니다.
(2) Format 을 갖춘 문자열을 만들어주는 메소드 (String Formatting Method): format() |
format() 메소드를 사용해서 형식을 갖춘 문자열을 만드는 방법에는 두 가지가 있습니다.
(2-1) 먼저 대괄호 { } 안에 변수 이름(variable name)을 지정해주고, format(variable name = value) 처럼 값을 지정해주는 방법입니다. 대괄호 { } 안에 문자열 형식을 지정할 변수가 많다면 명시적으로 변수명을 설정해주기 때문에 헷갈리지도 않고 코드 가독성도 높여주는 방법입니다.
>>> "I am {name} and {age} years old".format(name='Mr.Hong', age=40) 'I am Mr.Hong and 40 years old' |
format() 메소드 안에 값을 입력해줄 때 변수명별로 대입해서 입력하기 때문에 순서와는 상관이 없습니다.
>>> "I am {name} and {age} years old".format(age=40, name='Mr.Hong') 'I am Mr.Hong and 40 years old'
|
(2-2) 두번째 방법은 대괄호 { } 안에 문자열 입력하는 순서대로 데이터를 넣어주면 지정한 포맷대로 문자열을 만들어주는 방법입니다.
>>> "I am {0} and {1} years old".format('Mr.Hong', 40) 'I am Mr.Hong and 40 years old'
|
format() 메소드 안에 값을 입력하는 순서가 바뀌면 출력되는 문자열에 입력하는 값이 의도했던 바와는 다르게 실수로 뒤엉커버릴 수 있습니다. 따라서 대괄호 { }로 포맷을 설정할 변수가 많은 경우에는 실수를 유발할 위험이 있는 방법이니, 첫번째처럼 명시적으로 변수명을 지정해주는게 좋겠습니다.
>>> "I am {0} and {1} years old".format(40, 'Mr.Hong') # sequence matters 'I am 40 and Mr.Hong years old'
|
다음번 포스팅에서는 파이썬 리스트 (List)자료형의 생성 및 기본 활용법에 대해서 알아보겠습니다.
많은 도움이 되었기를 바랍니다.
이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾸욱 눌러주세요. ^^
'Python 분석과 프로그래밍 > Python 설치 및 기본 사용법' 카테고리의 다른 글
[Python] 리스트 내장 함수 및 메소드 (Python List Built-in functions and methods) (4) | 2017.08.21 |
---|---|
[Python] 파이썬 자료형 : 리스트 (List) 생성 및 기본 사용법 (0) | 2017.08.20 |
[Python] 파이썬 문자열 처리를 위한 다양한 메소드 (Python string methods) (0) | 2017.08.04 |
[Python] 파이썬 자료 유형 (Python data types) : 수(number), 문자열(string) (0) | 2017.07.01 |
[Python] 파이썬 기본 구문법 (Basic Syntax) (0) | 2017.04.23 |