지난번 포스팅에서는 파이썬 자료형식 중 '문자열(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=40name='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)자료형의 생성 및 기본 활용법에 대해서 알아보겠습니다. 


많은 도움이 되었기를 바랍니다. 


이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾸욱 눌러주세요. ^^



728x90
반응형
Posted by Rfriend
,