초보 개발자

21강 표현식 기반 문자열 조합 본문

Python/윤성우 열혈 파이썬

21강 표현식 기반 문자열 조합

taehyeki 2022. 1. 17. 19:51

[문자열 조합이란?]

 

다음과 같이 편집하듯 하나의 문자열을 구성해 내는 것을 가리켜 '문자열_조합'이라 한다.

s = 'i am' + str(7) + 'years old'

s
'i am 7 years old'

 

파이썬은 보다 괜찮은 문자열 조합 방법을 제공하고있다.

  • String formatting expression '표현식'을 기반으로 문자열 조합하기 '__%s_%s__' % (value, value)
  • String formatting method calls '메소드 호출'을 통해 문자열 조합하기 '__{ }_{ }__'.format(value, value)
s = 'My name is %s' % 'Yoon' # %의 위치에 문자열 'Yoon'이 삽입됨

s
'My name is Yoon'

좀 전 처럼 'my name is' + str 이런식으로 한다면 +를 붙여줘야되는 번거로움과 공백이 하나 생긴다는점과 또 많아지면 읽기 불편까지하다.

하지만 위와같은 formatting 방법을 활용하면 간단하게 처리 가능하다.

 

  • %s 이 위치에다가 문자열을 넣어라.
  • %d 이 위치에다가 정수를 넣어라 (10진수)
  • %f 이 위치에다가 실수를 넣어라
s = 'My friend %s is %d years old and %fcm tall.' % ('Jung',22,178.5)

s
'My friend Jung is 22 years old and 178.500000cm tall.'

위 처럼 값이 두개 이상일 때는 튜플로 묶어주자

 

만약 %d에 문자를 넣으면 오류가 발생한다.

반대로 %s에 숫자를 넣으면 오류가 발생하지 않는다. 이 이유는 파이썬이 형 변환이라는 것을 해주기 때문이다.

정수 22가 왔다면 문자 '22'로 바꿔준다. 단 역은 성립 X

 

그리고 정수와 실수에도 성립한다.

정수를 %f의 위치에 놓은 경우 정수가 실수로 자동변환

실수를 %d의 위치에 놓은 경우 실수가 정수로 자동변환 (소수점 이하 삭제, 데이터 손실 발생)

 

이러한 스타일의 장점은 이름을 통해서 삽입할 내용을 결정할 수도 있다. %(이름)s, %(이름)d

s = "%(name)s : %(age)d" % {'name' : 'Yoon', 'age' : 22}

s
'Yoon : 22'

아까는 순서를 바탕으로 넣었지만 지금은 이름이 바탕이 되기에 순서는 중요하지 않다. {'age',:22,'name':'Yoon'} 이렇게 와도 상관 없다.

 

[보다 세밀한 문자열 조합 지정]

 

%[flags][width][.precision]f

%와 f사이에 3가지 옵션을 줄 수 있다. 필요한 만큼 선택적으로 넣을 수 있음

 

[flags]            - 또는 0 또는 +를 넣어 특변한 신호를 줌 (부호)

[width]          폭, 어느 정도 넓이를 확보하고 출력할지 결정 (숫자)

[.precision]     정밀도, 소수 이하 몇째 자리까지 출력할지 결정 (.을 꼭 붙여야함)

 

먼저 .precision을 살펴보자

'height : %f' % 3.14
'height : 3.140000'

'height : %.3f' % 3.14 # 소수점 이하 셋째 자리까지 출력
'height : 3.140'

'height : %.2f' % 3.14 # 소수점 이하 둘째 자리까지 출력
'height : 3.14'

 

width를 추가해서 살펴보자

'height : %7.2f입니다.' % 3.14
'height :    3.14'입니다. #7칸 확보하고 그 공간에 3.14를 넣음

'height : %10.2f입니다.' % 3.14
'height :       3.14'입니다. #10칸 확보하고 그 공간에 3.14를 넣음

위에서 보이듯 7칸을 확보했는데 실제 출력할 내용은 3.14 즉 4칸이면 충분한 경우, 오른쪽에 붙여서 출력하고 나머지 공간은 그냥 비워둔다. 즉 첫 번째 출력의 결과에서는 세칸의 빈칸이 존재하게 된다.

 

이제 flag까지 추가해보자

flag 0

'height : %07.2f입니다.' % 3.14
'height : 0003.14'입니다. #7칸 확보하고 그 공간에 3.14를 넣음

'height : %010.2f입니다.' % 3.14
'height : 0000003.14'입니다. #10칸 확보하고 그 공간에 3.14를 넣음

빈공간에 0이 들어간다.

 

flag - 

'height : %07.2f입니다.' % 3.14
'height : 3.14   입니다.' #7칸 확보하고 그 공간에 3.14를 넣음

'height : %010.2f입니다.' % 3.14
'height : 3.14      입니다.' #10칸 확보하고 그 공간에 3.14를 넣음

-는 왼쪽으로 붙여서 출력하는것을 의미한다.

 

 

flag +

+는 우측정렬이라고 생각하기 쉬운데 아니다.

n = 3
'num: %+d' % n # flags에 +를 두면 부호가 함께 출력

n = -1
'num: %+d' % n # flags에 +를 두면 부호가 함께 출력
'num: -1' # 음수일 때는 당연히 -가 붙음

 

총 정리

'%(h)s : %-+10.3f입니다.' % {'h' :'height', 'v':3.14}
'height: +3.140     입니다.'