2023. 12. 8. 22:26ㆍpython/basic
F-문자열의 값과 개체 보간
Python f-문자열은 보간 및 형식 문자열을 지정합니다. 읽기 쉽고 간결하며 .format() 메소드 및 모듈로 연산자(%)와 같은 기존 문자열 보간 및 서식 지정 도구보다 오류가 발생할 가능성이 적습니다. f-문자열은 갸존 도구보다 약간 더 빠릅니다!
- f-문자열을 사용하여 문자열에 보간 값, 개체 및 표현식을 삽입하세요.
- 형식 지정 Python의 문자열 형식 지정 미니 언어를 사용하여 f-문자열 형식 지정
- Python 3.12 이상에서 f-문자열의 일부 멋진 기능 활용
- f-문자열 대신 기존 보간 도구를 사용할 시기 결정
형식화된 문자열 리터럴이라고도 불리는 f-문자열은 여는 따옴표 앞에 f가 있는 문자열 리터럴입니다. 중괄호로 묶인 Python 표현식을 포함할 수 있습니다. Python은 해당 표현식을 결과 값으로 대체합니다. 따라서 이 동작은 f-문자열을 문자열 보간 도구로 전환합니다.
name = "Jane"
age = 25
f"Hello, {name}! You're {age} years old."
F-문자열에 표현식 포함
f"{2 * 21}"
name = "Jane"
age = 25
f"Hello, {name.upper()}! You're {age} years old."
f"{[2**n for n in range(3, 9)]}"
Python의 F-String을 사용하여 문자열 형식 지정
balance = 5425.9292
f"Balance: ${balance:.2f}"
heading = "Centered string"
f"{heading:=^30}"
integer = -1234567
f"Comma as thousand separators: {integer:,}"
sep = "_"
f"User's thousand separators: {integer:{sep}}"
floating_point = 1234567.9876
f"Comma as thousand separators and two decimals: {floating_point:,.2f}"
date = (9, 6, 2023)
f"Date: {date[0]:02}-{date[1]:02}-{date[2]}"
from datetime import datetime
date = datetime(2023, 9, 26)
f"Date: {date:%m/%d/%Y}"
F-문자열의 기타 관련 기능
F-문자열에서 객체의 문자열 표현 사용
ㅇ !s str() 메소드에서 문자열 표현을 보간합니다 ㅇ !r repr() 메소드에서 문자열 표현을 보간합니다
str() 특수 방법은 일반적으로 객체에 대해 사용자에게 친숙한 문자열 표현을 제공하는 반면, repr() 방법은 개발자 친화적인 표현을 반환합니다.
# person.py
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"I'm {self.name}, and I'm {self.age} years old."
def __repr__(self):
return f"{type(self).__name__}(name='{self.name}', age={self.age})"
from person import Person
jane = Person("Jane Doe", 25)
f"{jane!s}"
"I'm Jane Doe, and I'm 25 years old."
f"{jane!r}"
"Person(name='Jane Doe', age=25)"
첫 번째 f-문자열에서 !s 태그를 사용하여 .__str__()가 반환하는 문자열 표현을 보간합니다. 두 번째 f-문자열에서는 !r 플래그를 사용하여 현재 객체의 개발자 친화적인 문자열 표현을 보간합니다.
디버깅을 위한 자체 문서화 표현식
f-문자열에 변수 이름 뒤에 등호(=)를 사용하여 자체 문서화된 표현식을 만들 수 있습니다. Python이 f-문자열을 실행할 때 변수 이름, 등호 및 변수의 현재 값을 포함하는 표현식과 유사한 문자열을 작성합니다. 이 f-문자열 기능은 코드에 빠른 디버깅 검사를 삽입하는 데 유용합니다.
variable = "Some mysterious value"
print(f"{variable = }")
print(f”{variable=}“) variable=‘Some mysterious value’
print(f”{variable= }“) variable= ‘Some mysterious value’
print(f”{variable =}“) variable =‘Some mysterious value’
성능 비교: F-String과 기존 도구
# performance.py
import timeit
name = "Linda Smith"
age = 40
strings = {
"Modulo operator": "'Name: %s Age: %s' % (name, age)",
".format() method": "'Name: {} Age: {}'.format(name, age)",
"f_string": "f'Name: {name} Age: {age}'",
}
def run_performance_test(strings):
max_length = len(max(strings, key=len))
for tool, string in strings.items():
time = timeit.timeit(
string,
number=1000000,
globals=globals()
) * 1000
print(f"{tool}: {time:>{max_length - len(tool) + 6}.2f} ms")
run_performance_test(strings)
F-문자열 업그레이드: Python 3.12 이상
따옴표 사용
person = {"name": "Jane", "age": 25}
f"Hello, {person['name']}! You're {person['age']} years old."
# python 3.11
f"Hello, {person["name"]}!"
File "<input>", line 1
f"Hello, {person["name"]}!"
Python 3.12
person = {“name”: “Jane”, “age”: 25} f”Hello, {person[“name”]}!” ‘Hello, Jane!’
# python 3.11
f"""{
f'''{
f"{f'{42}'}"
}'''
}"""
f"""{
f'''{
f"{f'{f"{42}"}'}"
}'''
}"""
Python 3.11까지 f-문자열의 중첩 수준 수는 사용 가능한 문자열 구분 기호(“, ‘, <)에 의해 제한됩니다. 따라서 중첩 수준을 구분하는 데 사용할 수 있는 구분 기호는 오직 ““” 및’’’, 4개뿐입니다.
Python 3.12에서는 따옴표를 재사용할 수 있으므로 이 제한이 제거되었습니다.
Python 3.12
f”{ … f”{ … f”{ … f”{ … f”{ … f”Deeply nested f-string!” … }” … }” … }” … }” … }” ‘Deeply nested f-string!’
백슬래시 사용
3.12 이전 f-문자열의 또 다른 제한 사항은 포함된 표현식에 백슬래시 문자를 사용할 수 없다는 것입니다.
# python 3.11
words = ["Hello", "World!", "I", "am", "a", "Pythonista!"]
f"{'\n'.join(words)}"
File "<input>", line 1
f"{'\n'.join(words)}"
Python 3.12
words = [“Hello”, “World!”, “I”, “am”, “a”, “Pythonista!”]
f”{‘’.join(words)}” ‘Hello!!’
print(f”{‘’.join(words)}“) Hello World! I am a Pythonista!
인라인 댓글 작성
Python 3.11까지의 F-문자열에서는 포함된 표현식에 # 기호를 사용할 수 없습니다.
# python 3.11
employee = {
"name": "John Doe",
"age": 35,
"job": "Python Developer",
}
f"""Storing employee's data: {
employee['name'].upper() # Always uppercase name before storing
}"""
Python 3.12
employee = { … “name”: “John Doe”, … “age”: 35, … “job”: “Python Developer”, … }
f”Storing employee’s data: { … employee[“name”].upper() # Always uppercase name before storing … }” “Storing employee’s data: JOHN DOE”
F-문자열 오류 메시지 해독
# Python 3.11
f"{42 + }"
오류 메시지는 일반적이며 문제가 있는 줄 내 오류의 정확한 위치를 가리키지 않습니다. 또한 표현식은 괄호로 둘러싸여 있는데, 이는 원본 코드에 괄호가 포함되어 있지 않기 때문에 문제에 잡음을 더합니다.
Python 3.12
f”{42 + }” File “”, line 1 f”{42 + }” ^ SyntaxError: f-string: expecting ‘=’, or ‘!’, or ‘:’, or ‘}’
Python 3.12에서는 오류 메시지가 더 장황합니다. 이는 영향을 받은 라인에서 문제의 정확한 위치를 알려줍니다. 또한 예외 메시지는 문제를 해결하는 데 도움이 될 수 있는 몇 가지 제안 사항을 제공합니다.
F-문자열에 대한 기존 문자열 형식 지정 도구 사용
f-문자열은 매우 멋지고 인기 있는 Python 기능이지만 모든 경우에 적용되는 일률적인 솔루션은 아닙니다. 때로는 모듈로 연산자(%) 또는 .format() 방법이 더 나은 솔루션을 제공할 수도 있습니다. 때로는 이것이 유일한 선택이기도 합니다. 이는 모두 특정 사용 사례에 따라 다릅니다.
사전 보간
person = {"name": "Jane Doe", "age": 25}
f"Hello, {person['name']}! You're {person['age']} years old."
"Hello, {name}! You're {age} years old.".format(**person)
"Hello, {name}!".format(**person)
"Hello, %(name)s! You're %(age)s years old." % person
"Hello, %(name)s!" % person
로깅의 지연 평가
f-문자열 또는 .format() 메소드를 사용하여 로깅 메시지를 구성하는 경우 Python은 선택한 로깅 수준에 관계없이 모든 문자열을 보간합니다. 그러나 % 연산자를 사용하고 보간할 값을 로깅 함수에 대한 인수로 제공하면 보간 프로세스가 최적화됩니다.
import logging
msg = "This is a %s message!"
logging.warning(msg, "WARNING")
logging.debug(msg, "DEBUGGING")
msg = "This is a {} message!"
logging.debug(msg.format("DEBUGGING"))
'python > basic' 카테고리의 다른 글
Python과 PySimpleGUI를 사용하여 행맨 게임 구축 (1) | 2023.12.11 |
---|---|
Python의 효율적인 문자열 연결 (0) | 2023.12.10 |
Python의 연산자 및 표현식 (1) | 2023.12.09 |
Python에서 명령줄용 행맨 게임 구축 (2) | 2023.12.07 |
파이썬을 사용하여 URL에서 파일을 다운로드 하는 방법 (2) | 2023.12.06 |