일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Container
- Python
- 재테크
- 하나머니
- 후기
- 리뷰
- built-in
- namespace
- codecommit
- 커피머니불리기
- Linux
- 도커
- docker network
- 리워드앱
- mininet
- aws codecommit
- network
- 실사용
- MongoDB
- 토스카드
- DocumentDB
- AWS
- python3
- docker
- 포인트앱
- MongoEngine
- S3
- clone
- VPC
- 앱테크
- Today
- Total
ㅍㅍㅋㄷ
python 3에서는 f-string이 갑이다. 본문
f-string 사용 방법과 사용해야 하는 이유
Python 에서 문자열을 다룰 때는 여러가지 방식으로 사용할 수 있다.
대부분은 아마도 기존 python 2에서 지원하던 %-formatting 방식과 Format string syntax 인 str.format() 메서드 방식을 주로 사용할 것이다.
하지만, 이 방식들은 모두 아쉬운 점이 있는데, 가장 큰 문제로 지적되는 것이 바로 가독성 문제이다.
아래 예를 보자.
name = 'song'
sex = 'male'
married = 'married'
language = 'python'
job = 's/w engineer'
'Hi, I am %s. I am %s and I like to use %s. I am %s and I was %s. Nice to meet you.' % (name, job, language, sex, married)
>>> 'Hi, I am song. I am s/w engineer and I like to use python. I am male and I was married. Nice to meet you.'
위에서 보면 알수 있듯이, 변수가 많아질수록 % 가 늘어나면서 문자열이 복잡해 지는 것을 볼 수 있다.
코드의 가독성이 현저히 떨어 지고 있는 것이 느껴질 것이다.
str.format() 을 사용해도 복잡한 상황이 별반 다르지 않다.
'Hi, I am {}, I am {} and I like to use {}. I am {} and I was {}. Nice to meet you.'.format(name, job, language, sex, married)
>>> 'Hi, I am song, I am s/w engineer and I like to use python. I am male and I was married. Nice to meet you.'
이를 해결하기 위해서 Python 신규 버전(3.6 이상) 부터는 Literal String Interpolation 이라는,
간단히 줄여서 f-string 이라고 불리는 새로운 기능을 제공해 준다.
먼저 간단한 사용법 부터 보자. f-string 은 아래와 같이 'f' 라는 접두사를 통해 간단하게 사용 가능하다.
name = 'Song'
sex = 'male'
f'Hi, I am {name}. I am {sex}.'
>>> 'Hi, I am song. I am male.'
f-string 은 대문자 'F' 로도 사용 가능하다. 하지만, 기본적으로 소문자 f를 사용하는게 PEP의 기본 가이드이기 때문에 이를 따르는게 좋다.
F'Hi, I am {name}. I am {sex}.'
>>> 'Hi, I am song. I am male.'
f-string를 사용한 문자열에는 중괄호 {} 를 이용해서 다양한 표현식을 사용할 수 있다.
python진영에서 많이 사용되어 오던 Jinja Template 과 비슷한 사용법 때문에 어렵지 않게 사용 가능하다.
표현하고자 하는 내용이 복잡해 질수록 더욱 빛을 발하게 된다.
f'Hi, I am {name}, I am {job} and I like to use {language}. I am {sex} and I was {married}. Nice to meet you.'
>>> 'Hi, I am song, I am s/w engineer and I like to use python. I am male and I was married. Nice to meet you.'
위의 %-formatting 이나 str.format() 방식보다 훨씬 직관적이다.
그리고 f-string은 다양한 방식으로도 사용 가능하다.
아래는 f-string을 사용하여 변수에 수식을 더해서 사용했을 때의 표현 방법이다.
x = 10
y = 3
f'x + y = {x+y} | x * y = {x*y}'
>>> 'x + y = 13 | x * y = 30'
매우 간단하게 표현 가능함을 볼 수 있다.
이를 기존의 %-formatting 과 str.format() 을 사용했을때와 비교해 보자.
# Use %-formatting
'x + y = %d | x * y = %d' %(x+y, x*y)
>>> 'x + y = 13 | x * y = 30'
# Use str.format()
'x + y = {} | x * y = {}'.format(x+y, x*y)
>>> 'x + y = 13 | x * y = 30'
f-string을 사용했을때, 기존의 %-formatting 이나 str.format() 방식보다 훨씬 간결하게 표현 가능한 것을 볼 수 있다.
이러한 점 말고도 f-string을 사용했을때의 추가적인 장점들을 몇가지 더 살펴보자.
첫번째로, 문자열에 표현하고자하는 대상 변수의 type에 대해 자유도가 더 높다.
이해하기 쉽도록 예제를 통해 알아보자.
tuple = ('Hi, I am', 'song', 123)
위와 같은 tuple 형의 값이 있다고 가정했을때,
이를 %-formatting 을 사용해 문자열에서 표현하고자 하면 아래와 같은 에러 메시지를 볼 수 있다.
'tuple: %s' %(tuple)
>>> Traceback (most recent call last):
>>> File "<stdin>", line 1, in <module>
>>> TypeError: not all arguments converted during string formatting
%-formatting 은 기본적으로 int, string, double 형만 지원하기 때문에 위와 같은 tuple 형은 지원하지 못한다.
이를 해결하려면 아래와 같이 string 으로 명시적으로 변환해야 하는 과정을 거쳐야 한다.
'tuple: %s' %(str(tuple))
>>> "tuple: ('Hi, I am', 'song', 123)"
만약 f-string을 사용한다면, 이러한 고민 없이 바로 사용 가능하다.
f'tuple: {tuple}'
>>> "tuple: ('Hi, I am', 'song', 123)"
또 다른 예를 보자.
아래는 날짜 변수를 이용한 예제이다.
import datetime
date = datetime.datetime.now()
f'{date:%Y-%m-%d} is on a {date:%A}'
>>> '2019-05-11 is on a Saturday'
f-string 을 이용하면, 위와 같이 간단하게 datetime 포맷 변경이 가능하다.
기존 str.format() 과 비교해 보면, f-string 이 얼마나 손쉽게 사용 가능한지 비교될 것이다.
'{} is on a {}'.format(date.strftime("%Y-%m-%d"), date.strftime("%A") )
>>> '2019-05-11 is on a Saturday'
참고
'Programming > Python' 카테고리의 다른 글
Python3 - Function annotation 에 대하여 (2) | 2019.06.20 |
---|---|
python 3와 python 2의 dictionary 차이 - view object (0) | 2019.02.19 |
python - filter 함수. 어렵지 않아요 (0) | 2019.01.24 |
python eval 과 literal_eval 의 차이 (1) | 2019.01.22 |
python eval() 함수 - 사용을 조심해야 하는 이유 (4) | 2019.01.22 |