문자열 형식 : % vs. 형식


1348

Python 2.6 str.format()은 기존 %연산자 와 약간 다른 구문으로 메소드를 도입했습니다 . 어느 것이 더 좋고 어떤 상황에 적합합니까?

  1. 다음은 각 방법을 사용하며 동일한 결과를 가지므로 차이점은 무엇입니까?

    #!/usr/bin/python
    sub1 = "python string!"
    sub2 = "an arg"
    
    a = "i am a %s" % sub1
    b = "i am a {0}".format(sub1)
    
    c = "with %(kwarg)s!" % {'kwarg':sub2}
    d = "with {kwarg}!".format(kwarg=sub2)
    
    print a    # "i am a python string!"
    print b    # "i am a python string!"
    print c    # "with an arg!"
    print d    # "with an arg!"
    
  2. 또한 파이썬에서 문자열 서식이 언제 발생합니까? 예를 들어, 로깅 수준이 높음으로 설정되어 있어도 다음 %작업 을 수행해도 여전히 적중 합니까? 그렇다면, 이것을 피할 수있는 방법이 있습니까?

    log.debug("some debug info: %s" % some_info)


2
초보자 : 두 스타일을 모두 가르치는 매우 유용한 자습서 가 있습니다. 나는 개인적으로 이전 사용 %당신이의 향상된 기능이 필요하지 않은 경우 때문에, 더 자주 스타일을 format()스타일의 %스타일은 종종 훨씬 더 편리합니다.
Lutz Prechelt

2
참고로 다음 파이썬 3 설명서를 새로운 format()포맷 스타일나이 %기반 포맷 스타일 .
Lutz Prechelt


1
두 번째 질문에 답하기 위해 3.2 이후로 사용자 정의 포맷터를 사용하는 경우 {} 형식을 사용할 수 있습니다 ( docs.python.org/3/library/logging.html#logging.Formatter 참조 )
yanjost

답변:


953

첫 번째 질문에 답하는 것은 .format여러 가지면에서 더 정교 해 보입니다. 성가신 것은 %변수 또는 튜플을 취할 수있는 방법입니다. 다음은 항상 작동한다고 생각합니다.

"hi there %s" % name

그러나이면 name발생 (1, 2, 3)합니다 TypeError. 항상 인쇄되도록하려면해야합니다.

"hi there %s" % (name,)   # supply the single argument as a single-item tuple

그건 못 생겼어 .format그런 문제가 없습니다. 또한 두 번째 예제에서는 .format예제가 훨씬 깔끔해졌습니다.

왜 사용하지 않습니까?

  • 그것에 대해 모른다 (이것을 읽기 전에 나)
  • 파이썬 2.5와 호환되어야 함

두 번째 질문에 답하기 위해 문자열 형식화 표현식을 평가할 때 문자열 형식화는 다른 작업과 동시에 발생합니다. 그리고 게으른 언어가 아닌 Python은 함수를 호출하기 전에 표현식을 평가하므로 log.debug예제에서 표현식 "some debug info: %s"%some_info은 먼저 평가됩니다. 예를 들어 "some debug info: roflcopters are active"해당 문자열이에 전달됩니다 log.debug().


113
대해"%(a)s, %(a)s" % {'a':'test'}
테드

128
당신은 시간을 낭비 않습니다 log.debug("something: %s" % x)하지만 아니 log.debug("something: %s", x) 문자열 포맷 방법으로 처리되며,이 기록에 남지 않습니다 경우 성능 저하을받지 않습니다. 언제나 그렇듯이, 파이썬은 당신의 요구를 기대합니다 =)
darkfeline

63
ted :와 같은 작업을 수행하는 것은 좋지 않은 해킹 '{0}, {0}'.format('test')입니다.
날으는 양

19
요점은 다음과 같습니다. 새로운 구문이 항목의 재정렬을 허용한다는 한 가지 반복되는 주장은 논쟁의 여지가 있습니다. 이전 구문과 동일한 작업을 수행 할 수 있습니다. 대부분의 사람들은 이것이 실제로 Ansi C99 Std에 이미 정의되어 있다는 것을 모릅니다! 최근 사본을 확인하고 자리 표시 자 내부 man sprintf$표기법에 대해 알아보십시오%
cfi

29
@cfi : printf("%2$d", 1, 3)"3"을 출력하는 것과 같은 의미는 C99가 아니라 POSIX에 지정되어 있습니다. 맨 페이지에서 "C99 표준에는 '$'…를 사용하는 스타일이 포함되어 있지 않습니다."라고 언급했습니다.
Thanatos

307

모듈로 연산자 (%)가 할 수없는 일, afaik :

tu = (12,45,22222,103,6)
print '{0} {2} {1} {2} {3} {2} {4} {2}'.format(*tu)

결과

12 22222 45 22222 103 22222 6 22222

매우 유용한.

format()함수 인 다른 점 은 다른 함수의 인수로 사용할 수 있습니다.

li = [12,45,78,784,2,69,1254,4785,984]
print map('the number is {}'.format,li)   

print

from datetime import datetime,timedelta

once_upon_a_time = datetime(2010, 7, 1, 12, 0, 0)
delta = timedelta(days=13, hours=8,  minutes=20)

gen =(once_upon_a_time +x*delta for x in xrange(20))

print '\n'.join(map('{:%Y-%m-%d %H:%M:%S}'.format, gen))

결과 :

['the number is 12', 'the number is 45', 'the number is 78', 'the number is 784', 'the number is 2', 'the number is 69', 'the number is 1254', 'the number is 4785', 'the number is 984']

2010-07-01 12:00:00
2010-07-14 20:20:00
2010-07-28 04:40:00
2010-08-10 13:00:00
2010-08-23 21:20:00
2010-09-06 05:40:00
2010-09-19 14:00:00
2010-10-02 22:20:00
2010-10-16 06:40:00
2010-10-29 15:00:00
2010-11-11 23:20:00
2010-11-25 07:40:00
2010-12-08 16:00:00
2010-12-22 00:20:00
2011-01-04 08:40:00
2011-01-17 17:00:00
2011-01-31 01:20:00
2011-02-13 09:40:00
2011-02-26 18:00:00
2011-03-12 02:20:00

17
이전 스타일 서식을 서식 map처럼 쉽게 사용할 수 있습니다 . map('some_format_string_%s'.__mod__, some_iterable)
agf

3
@cfi : 바로 C99에서 위의 예를 다시 작성하여 당신이 증명하십시오

9
@MarcH :로 printf("%2$s %1$s\n", "One", "Two");컴파일 gcc -std=c99 test.c -o test하면 출력은 Two One입니다. 그러나 나는 정정했습니다 : 실제로 POSIX 확장 이며 C가 아닙니다. C / C ++ 표준에서 다시 찾을 수는 없습니다. 이 코드는 'c90'std 플래그와도 작동합니다. sprintf맨 페이지 . 이것은 그것을 나열하지는 않지만 libs가 수퍼 셋을 구현할 수있게합니다. 내 원래의 주장은 대체 여전히 유효 CPosix
CFI

8
나의 첫 번째 의견은이 답변에 적용되지 않습니다. 문구를 후회합니다. 파이썬에서는 %자리 표시자를 재정렬 하기 위해 모듈로 연산자 를 사용할 수 없습니다 . 의견 일관성을 유지하기 위해 첫 번째 의견을 삭제하고 싶지 않습니다. 여기 내 분노를 풀어 준 것에 대해 사과드립니다. 종종 오래된 구문 자체는 이것을 허용하지 않을 것이라는 성명서에 반대합니다. 완전히 새로운 구문을 만드는 대신 std Posix 확장을 도입 할 수있었습니다. 둘 다 가질 수 있습니다.
cfi

17
'모듈로'는 분할 후 나머지를 평가하는 연산자를 나타냅니다. 이 경우 퍼센트 부호는 모듈로 연산자가 아닙니다.
Octopus

148

Python의 logging모듈을 사용한다고 가정하면 문자열 형식화 인수를 .debug()형식화를 직접 수행하는 대신 메소드에 인수로 전달할 수 있습니다 .

log.debug("some debug info: %s", some_info)

로거가 실제로 무언가를 기록하지 않는 한 포맷팅을 피합니다.


10
이것은 내가 지금 배운 유용한 정보입니다. 그것은 주요 질문과 분리되어있는 것처럼 자신의 질문이없는 것이 유감입니다. 안타깝게도 OP는 질문을 두 개의 개별 질문으로 나누지 않았습니다.
snth

12
dict 형식을 다음과 같이 사용할 수 있습니다. log.debug("some debug info: %(this)s and %(that)s", dict(this='Tom', that='Jerry')) 그러나 .format()부끄러운 Python 3.3에서도 새 스타일 구문을 사용할 수 없습니다 .
Cito

15
@Cito : 이것을보십시오 : plumberjack.blogspot.co.uk/2010/10/…
Vinay Sajip

26
이것의 주요 이점은 성능이 아닙니다 (문자열 보간을 수행하면 로깅 출력 (예 : 터미널에 표시, 디스크에 저장)으로 수행하는 작업에 비해 빠르게 진행됨) 로깅 애그리 게이터가있는 경우 "some_info"값이 모두 다르더라도 "이 오류 메시지의 12 개 인스턴스가 있습니다"라고 말할 수 있습니다. 문자열을 log.debug에 전달하기 전에 문자열 형식화가 완료되면 불가능합니다. 애그리 게이터는 "12 개의 서로 다른 로그 메시지를 가졌다"
Jonathan Hartley

7
성능이 걱정된다면 dict () 클래스 인스턴스 대신 리터럴 dict {} 구문을 사용하십시오. doughellmann.com/2012/11/…
trojjer

119

Python 3.6 (2016) 부터 f- 문자열 을 사용하여 변수를 대체 할 수 있습니다 .

>>> origin = "London"
>>> destination = "Paris"
>>> f"from {origin} to {destination}"
'from London to Paris'

f"접두사를 적어 둡니다. 파이썬 3.5 또는 이전 버전에서 이것을 시도하면을 얻을 수 있습니다 SyntaxError.

https://docs.python.org/3.6/reference/lexical_analysis.html#f-strings를 참조 하십시오.


1
이것은 질문에 대답하지 않습니다. f-string을 언급하는 또 다른 대답은 최소한 성능에 대해 이야기합니다. stackoverflow.com/a/51167833/7851470
Georgy

60

PEP 3101%파이썬 3에서 기본값 인 새로운 고급 문자열 형식으로 연산자를 대체 할 것을 제안합니다 .


14
사실이 아님 : "기존 메커니즘을 그대로 유지함으로써 이전 버전과의 호환성을 유지할 수 있습니다."; 물론, .format하지 대체 % 문자열 서식을.
Tobias

12
아닙니다. BrainStorms의 가정은 "기존의 '%'을 (를) 대체하기위한 것"입니다. Tobias 인용문은 두 시스템이 한동안 공존 할 것임을 의미합니다. RTFPEP
phobie

54

그러나 모든 교체 할 때 지금 내가 한 문제가 발견 한주의 해주십시오 %.format: 기존 코드의 '{}'.format(unicode_string)인코딩 UNICODE_STRING 시도하고 아마 실패 할 것이다.

이 Python 대화식 세션 로그를 살펴보십시오.

Python 2.7.2 (default, Aug 27 2012, 19:52:55) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] on linux2
; s='й'
; u=u'й'
; s
'\xd0\xb9'
; u
u'\u0439'

s문자열 (Python3에서는 '바이트 배열'이라고 함)이고 u유니 코드 문자열 (Python3에서는 '문자열'이라고 함)입니다.

; '%s' % s
'\xd0\xb9'
; '%s' % u
u'\u0439'

유니 코드 객체를 %연산자에 매개 변수로 제공 하면 원래 문자열이 유니 코드가 아닌 경우에도 유니 코드 문자열이 생성됩니다.

; '{}'.format(s)
'\xd0\xb9'
; '{}'.format(u)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'latin-1' codec can't encode character u'\u0439' in position 0: ordinal not in range(256)

그러나 .format함수는 "UnicodeEncodeError"를 발생 시킵니다 .

; u'{}'.format(s)
u'\xd0\xb9'
; u'{}'.format(u)
u'\u0439'

원래 문자열이 유니 코드 인 경우에만 유니 코드 인수로 잘 작동합니다.

; '{}'.format(u'i')
'i'

또는 인수 문자열을 문자열로 변환 할 수있는 경우 ( '바이트 배열'이라고 함)


12
새로운 format방법 의 추가 기능 이 실제로 필요한 경우가 아니면 작업 코드를 변경할 이유가 없습니다 .
Tobias

절대적으로, 토비아스에 동의하지만, 때로는이 필요한 때 파이썬의 최신 버전으로 업그레이드
wobmene

2
예를 들어? AFAIK, 그것은 결코 필요 하지 않았습니다. %문자열 보간이 사라질 것 같지는 않습니다 .
Tobias

4
문자열의 경우 .format () 함수가 %보다 안전하다고 생각합니다. 종종이 같은 초보자의 실수 참조 "p1=%s p2=%d" % "abc", 2또는 "p1=%s p2=%s" % (tuple_p1_p2,). 코더의 잘못이라고 생각할 수도 있지만, 퀵 스크립트에는 좋지만 프로덕션 코드에는 좋지 않은 이상한 잘못된 구문이라고 생각합니다.
wobmene

3
하지만 .format ()의 구문을 좋아하지 않아, 나는 좋은 오래된에 더 행복 할 것 %s, %02d좋아 "p1=%s p2=%02d".format("abc", 2). 나는 중괄호 형식을 발명하고 승인 한 사람들을 비난 {{}}하고 못생긴 것처럼 보이게합니다.
wobmene

35

또 다른 장점 .format(답변에 표시되지 않음) : 객체 속성을 사용할 수 있습니다.

In [12]: class A(object):
   ....:     def __init__(self, x, y):
   ....:         self.x = x
   ....:         self.y = y
   ....:         

In [13]: a = A(2,3)

In [14]: 'x is {0.x}, y is {0.y}'.format(a)
Out[14]: 'x is 2, y is 3'

또는 키워드 인수로 :

In [15]: 'x is {a.x}, y is {a.y}'.format(a=a)
Out[15]: 'x is 2, y is 3'

%내가 알 수있는 한 불가능합니다 .


4
이것은 동등한 것과 비교할 때 필요 이상으로 읽을 수없는 것처럼 보입니다 'x is {0}, y is {1}'.format(a.x, a.y). a.x작업 비용이 매우 비싼 경우에만 사용해야합니다 .
dtheodor

13
@dtheodor 비틀기와 함께 ... 대신 위치 인수의 키워드 인수를 사용합니다 'x is {a.x}, y is {a.y}'.format(a=a). 두 예제보다 더 읽기 쉽습니다.
CivFan

1
@CivFan 또는 두 개 이상의 개체가있는 경우'x is {a.x}, y is {a.y}'.format(**vars())
Jack

1
또한 같은 방식으로이 것을 주목하십시오 : '{foo[bar]}'.format(foo={'bar': 'baz'}).
앙투안 핀 사드

3
이 기능은 응용 프로그램이 사용자 제공 형식 문자열과 함께 표준 형식 옵션 세트를 제공하는 고객 용 응용 프로그램에 매우 유용합니다. 나는 이것을 항상 사용합니다. 예를 들어 구성 파일에는 "messagestring"속성이 있으며 사용자가 Your order, number {order[number]} was processed at {now:%Y-%m-%d %H:%M:%S}, will be ready at about {order[eta]:%H:%M:%S}원하는대로 제공 할 수 있습니다 . 이전 포매터와 동일한 기능을 제공하는 것보다 훨씬 깔끔합니다. 사용자 제공 형식 문자열을 더 강력하게 만듭니다.
Taywee

35

%format내 테스트 보다 더 나은 성능을 제공합니다 .

테스트 코드 :

파이썬 2.7.2 :

import timeit
print 'format:', timeit.timeit("'{}{}{}'.format(1, 1.23, 'hello')")
print '%:', timeit.timeit("'%s%s%s' % (1, 1.23, 'hello')")

결과:

> format: 0.470329046249
> %: 0.357107877731

파이썬 3.5.2

import timeit
print('format:', timeit.timeit("'{}{}{}'.format(1, 1.23, 'hello')"))
print('%:', timeit.timeit("'%s%s%s' % (1, 1.23, 'hello')"))

결과

> format: 0.5864730989560485
> %: 0.013593495357781649

Python2에서는 차이가 작지만 Python3에서는 %보다 빠릅니다 format.

샘플 코드에 대해 @Chris Cogdon에게 감사드립니다.

편집 1 :

2019 년 7 월 Python 3.7.2에서 다시 테스트되었습니다.

결과:

> format: 0.86600608
> %: 0.630180146

큰 차이는 없습니다. 파이썬이 점차 향상되고 있다고 생각합니다.

편집 2 :

누군가가 python 3의 f-string을 주석으로 언급 한 후 python 3.7.2에서 다음 코드를 테스트했습니다.

import timeit
print('format:', timeit.timeit("'{}{}{}'.format(1, 1.23, 'hello')"))
print('%:', timeit.timeit("'%s%s%s' % (1, 1.23, 'hello')"))
print('f-string:', timeit.timeit("f'{1}{1.23}{\"hello\"}'"))

결과:

format: 0.8331376779999999
%: 0.6314778750000001
f-string: 0.766649943

f-string이 여전히 느리지 만보다 %낫습니다 format.


42
대신 str.format더 많은 기능을 제공합니다 (예 : 형식 별 형식 지정 '{0:%Y-%m-%d}'.format(datetime.datetime.utcnow())). 모든 작업의 ​​성능이 반드시 필요한 것은 아닙니다. 작업에 적합한 도구를 사용하십시오.
minhee

36
"조기 최적화는 모든 악의 근원" 이라고 도널드 크 누스는 한 번 말했다.
Yatharth Agarwal

22
잘 알려진 형식화 체계 (대부분의 경우에 필요한 요구에 적합하고 두 배 빠름)를 고수하는 것은 "조기 최적화"가 아니라 단순히 합리적입니다. BTW, %운영자는 printf지식 을 재사용 할 수 있습니다 . 사전 보간은 원리의 매우 간단한 확장입니다.
Tobias

5
나는 실제로 한 상황에서 반대를 경험했습니다. 새로운 스타일의 서식이 더 빨라졌습니다. 사용한 테스트 코드를 제공 할 수 있습니까?
David Sanders

8
예나 추론이없는 심각한 낭비 게시물처럼 보입니다.
kevr

31

오늘 발견했듯이 문자열을 형식화하는 오래된 방법은 상자에서 10 진수 고정 소수점 및 부동 소수점 산술을위한 Python 모듈을 %지원하지 않습니다 Decimal.

예 (Python 3.3.5 사용) :

#!/usr/bin/env python3

from decimal import *

getcontext().prec = 50
d = Decimal('3.12375239e-24') # no magic number, I rather produced it by banging my head on my keyboard

print('%.50f' % d)
print('{0:.50f}'.format(d))

산출:

0.00000000000000000000000312375239000000009907464850 0.00000000000000000000000312375239000000000000000000

해결 방법이있을 수 있지만 여전히 format()방법을 즉시 사용할 것을 고려할 수 있습니다.


1
아마도 새로운 스타일의 포맷팅 str(d)은 매개 변수를 확장하기 전에 호출 하는 반면, 구식 포맷은 아마도 float(d)먼저 호출 하기 때문 입니다.
David Sanders

3
그렇게 생각하지만 것 str(d)반환 "3.12375239e-24"하지"0.00000000000000000000000312375239000000000000000000"

18

파이썬이 3.6 이상이면 F- 문자열 형식의 리터럴이 새로운 친구입니다.

더 간단하고 깨끗하며 더 나은 성능입니다.

In [1]: params=['Hello', 'adam', 42]

In [2]: %timeit "%s %s, the answer to everything is %d."%(params[0],params[1],params[2])
448 ns ± 1.48 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [3]: %timeit "{} {}, the answer to everything is {}.".format(*params)
449 ns ± 1.42 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [4]: %timeit f"{params[0]} {params[1]}, the answer to everything is {params[2]}."
12.7 ns ± 0.0129 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)

15

참고로, 로깅과 함께 새로운 스타일 형식을 사용하기 위해 성능을 저하시킬 필요는 없습니다. 당신은 어떤 개체를 전달할 수 있습니다 logging.debug, logging.info등이 구현하는 __str__마법의 방법. 로깅 모듈이 메시지 오브젝트 (무엇이든)를 방출해야한다고 결정한 경우이를 str(message_object)수행하기 전에 호출합니다 . 따라서 다음과 같이 할 수 있습니다.

import logging


class NewStyleLogMessage(object):
    def __init__(self, message, *args, **kwargs):
        self.message = message
        self.args = args
        self.kwargs = kwargs

    def __str__(self):
        args = (i() if callable(i) else i for i in self.args)
        kwargs = dict((k, v() if callable(v) else v) for k, v in self.kwargs.items())

        return self.message.format(*args, **kwargs)

N = NewStyleLogMessage

# Neither one of these messages are formatted (or calculated) until they're
# needed

# Emits "Lazily formatted log entry: 123 foo" in log
logging.debug(N('Lazily formatted log entry: {0} {keyword}', 123, keyword='foo'))


def expensive_func():
    # Do something that takes a long time...
    return 'foo'

# Emits "Expensive log entry: foo" in log
logging.debug(N('Expensive log entry: {keyword}', keyword=expensive_func))

이 내용은 Python 3 설명서 ( https://docs.python.org/3/howto/logging-cookbook.html#formatting-styles )에 설명되어 있습니다. 그러나 Python 2.6에서도 작동합니다 ( https://docs.python.org/2.6/library/logging.html#using-arbitrary-objects-as-messages ).

이 기법을 사용하는 것의 장점 중 하나는 형식 지정 불가지론이라는 사실 외에 expensive_func위 의 함수와 같이 게으른 값을 허용한다는 것 입니다. 이것은 https://docs.python.org/2.6/library/logging.html#optimization 에서 Python 문서에 제공되는 조언에 대한보다 우아한 대안을 제공합니다 .


2
나는 이것을 더 많이 투표 할 수 있으면 좋겠다. format성능 저하없이 로깅 할 수 있습니다 - 설계된 __str__대로 정확하게 재정 의하여 수행합니다. logging문자 N를 정의하는 표준 방법 중 일부와 매우 흡사 한 단일 문자 ( )에 대한 함수 호출을 단축합니다. 함수 호출. 감사합니다! +1
CivFan

2
logging.Formatter(style='{')매개 변수 사용과 다른 점이 있습니까?
davidA

10

%정규 표현식의 형식을 지정할 때 도움이 될 수 있는 상황이 있습니다. 예를 들어

'{type_names} [a-z]{2}'.format(type_names='triangle|square')

제기한다 IndexError. 이 상황에서는 다음을 사용할 수 있습니다.

'%(type_names)s [a-z]{2}' % {'type_names': 'triangle|square'}

이것은 정규 표현식을로 쓰는 것을 피합니다 '{type_names} [a-z]{{2}}'. 이것은 두 개의 정규 표현식이있을 때 유용 할 수 있는데, 하나는 형식없이 단독으로 사용되지만 둘의 연결은 형식이 지정됩니다.


3
또는 그냥 사용하십시오 '{type_names} [a-z]{{2}}'.format(type_names='triangle|square'). 그것은 말처럼 .format()이미 퍼센트 문자를 포함하는 문자열을 사용하는 경우 캔의 도움을. 확실한. 당신은 그들을 탈출해야합니다.
Alfe

1
@Alfe 당신이 옳습니다. 그래서 대답은 시작으로 시작합니다. "One situation where % may help is when you are formatting regex expressions."구체적으로, a=r"[a-z]{2}"두 개의 다른 최종 표현 (예 c1 = b + a, 및 c2 = a)에 사용될 정규식 덩어리 라고 가정하십시오 . ed 가 c1필요 하지만 format(예를 들어 b런타임 형식을 지정해야 함) 가정 c2하지 마십시오. 그런 다음 필요 a=r"[a-z]{2}"에 대한 c2a=r"[a-z]{{2}}"를 위해 c1.format(...).
Jorge Leitao

7

3.6 버전부터 다음과 같이 fstring을 사용할 수 있다고 덧붙입니다.

foo = "john"
bar = "smith"
print(f"My name is {foo} {bar}")

주는

제 이름은 존 스미스입니다

모든 것이 문자열로 변환됩니다

mylist = ["foo", "bar"]
print(f"mylist = {mylist}")

결과:

mylist = [ 'foo', 'bar']

다른 형식과 마찬가지로 함수를 전달할 수 있습니다.

print(f'Hello, here is the date : {time.strftime("%d/%m/%Y")}')

예를 들어주는

안녕하세요, 날짜는 다음과 같습니다 : 16/04/2018


4

Python 버전> = 3.6의 경우 ( PEP 498 참조 )

s1='albha'
s2='beta'

f'{s1}{s2:>10}'

#output
'albha      beta'

2

파이썬 3.6.7 비교 :

#!/usr/bin/env python
import timeit

def time_it(fn):
    """
    Measure time of execution of a function
    """
    def wrapper(*args, **kwargs):
        t0 = timeit.default_timer()
        fn(*args, **kwargs)
        t1 = timeit.default_timer()
        print("{0:.10f} seconds".format(t1 - t0))
    return wrapper


@time_it
def new_new_format(s):
    print("new_new_format:", f"{s[0]} {s[1]} {s[2]} {s[3]} {s[4]}")


@time_it
def new_format(s):
    print("new_format:", "{0} {1} {2} {3} {4}".format(*s))


@time_it
def old_format(s):
    print("old_format:", "%s %s %s %s %s" % s)


def main():
    samples = (("uno", "dos", "tres", "cuatro", "cinco"), (1,2,3,4,5), (1.1, 2.1, 3.1, 4.1, 5.1), ("uno", 2, 3.14, "cuatro", 5.5),) 
    for s in samples:
        new_new_format(s)
        new_format(s)
        old_format(s)
        print("-----")


if __name__ == '__main__':
    main()

산출:

new_new_format: uno dos tres cuatro cinco
0.0000170280 seconds
new_format: uno dos tres cuatro cinco
0.0000046750 seconds
old_format: uno dos tres cuatro cinco
0.0000034820 seconds
-----
new_new_format: 1 2 3 4 5
0.0000043980 seconds
new_format: 1 2 3 4 5
0.0000062590 seconds
old_format: 1 2 3 4 5
0.0000041730 seconds
-----
new_new_format: 1.1 2.1 3.1 4.1 5.1
0.0000092650 seconds
new_format: 1.1 2.1 3.1 4.1 5.1
0.0000055340 seconds
old_format: 1.1 2.1 3.1 4.1 5.1
0.0000052130 seconds
-----
new_new_format: uno 2 3.14 cuatro 5.5
0.0000053380 seconds
new_format: uno 2 3.14 cuatro 5.5
0.0000047570 seconds
old_format: uno 2 3.14 cuatro 5.5
0.0000045320 seconds
-----

3
각 예제를 여러 번 실행해야합니다. 한 번의 실행으로 오해의 소지가있을 수 있습니다. 예를 들어 운영 체제가 일반적으로 바빠서 코드 실행이 지연 될 수 있습니다. docs.python.org/3/library/timeit.html 문서를 참조하십시오 . (nice avatar, Guybrush!)
jake77

1

그러나 중괄호가 중첩되어 있으면 형식 %이 작동 하지 않지만 작동합니다.

예:

>>> '{{0}, {1}}'.format(1,2)
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    '{{0}, {1}}'.format(1,2)
ValueError: Single '}' encountered in format string
>>> '{%s, %s}'%(1,2)
'{1, 2}'
>>> 

2
이 작업을 수행 할 수는 있지만 굉장한 '{{{0}, {1}}}'. format (1, 2)
Sylvan LE DEUNFF

중첩 키워드 중괄호가 작동하고 예쁘다.
CivFan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.