Formattazione delle stringhe:% vs. .format


1349

Python 2.6 ha introdotto il str.format()metodo con una sintassi leggermente diversa %dall'operatore esistente . Qual è la migliore e per quali situazioni?

  1. Quanto segue utilizza ogni metodo e ha lo stesso risultato, quindi qual è la differenza?

    #!/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. Inoltre, quando si verifica la formattazione delle stringhe in Python? Ad esempio, se il mio livello di registrazione è impostato su ALTO, avrò comunque un colpo per eseguire la seguente %operazione? E se è così, c'è un modo per evitarlo?

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


2
Per i principianti: ecco un tutorial molto carino che insegna entrambi gli stili. Personalmente uso %più spesso lo stile più vecchio , perché se non hai bisogno delle migliori capacità dello format()stile, lo %stile è spesso molto più conveniente.
Lutz Prechelt,

2
Per riferimento: Python 3 documentazione per il più nuovo format()stile di formattazione e il vecchio %stile di formattazione based .
Lutz Prechelt,


1
Per rispondere alla tua seconda domanda, dal 3.2 puoi usare il formato {} se usi un formatter personalizzato (vedi docs.python.org/3/library/logging.html#logging.Formatter )
yanjost

Risposte:


953

Per rispondere alla tua prima domanda ... .formatsembra solo più sofisticato in molti modi. Una cosa fastidiosa %è anche come può prendere una variabile o una tupla. Penseresti che funzionerebbe sempre quanto segue:

"hi there %s" % name

eppure, se namesuccede (1, 2, 3), lancerà a TypeError. Per garantire che stampi sempre, dovresti farlo

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

che è semplicemente brutto. .formatnon ha questi problemi. Anche nel secondo esempio che hai dato, l' .formatesempio è molto più pulito.

Perché non dovresti usarlo?

  • non saperlo (io prima di leggere questo)
  • dover essere compatibile con Python 2.5

Per rispondere alla tua seconda domanda, la formattazione della stringa viene eseguita contemporaneamente a qualsiasi altra operazione, quando viene valutata l'espressione della formattazione della stringa. E Python, non essendo un linguaggio pigro, valuta le espressioni prima di chiamare le funzioni, quindi nel tuo log.debugesempio, l'espressione "some debug info: %s"%some_infoverrà valutata prima, ad esempio "some debug info: roflcopters are active", poi quella stringa verrà passata a log.debug().


113
che dire"%(a)s, %(a)s" % {'a':'test'}
ted

128
Nota che perderai tempo per log.debug("something: %s" % x)ma non per log.debug("something: %s", x) La formattazione delle stringhe verrà gestita nel metodo e non otterrai il risultato se non verrà registrato. Come sempre, Python anticipa le tue esigenze =)
darkfeline il

63
ted: è un trucco dall'aspetto peggiore per fare lo stesso di '{0}, {0}'.format('test').
volo di pecore il

19
Il punto è: l'unico argomento ricorrente secondo cui la nuova sintassi consente di riordinare gli elementi è un punto controverso: puoi fare lo stesso con la vecchia sintassi. Molte persone non sanno che questo è già definito nell'Ansi C99 Std! Guarda una copia recente man sprintfe scopri la $notazione all'interno dei %segnaposto
cfi

29
@cfi: se vuoi dire qualcosa del genere, printf("%2$d", 1, 3)per stampare "3", è specificato in POSIX, non in C99. La pagina man a cui hai fatto riferimento indica "Lo standard C99 non include lo stile usando '$' ...".
Thanatos

307

Qualcosa che l'operatore modulo (%) non può fare, afaik:

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

risultato

12 22222 45 22222 103 22222 6 22222

Molto utile.

Un altro punto: format()essendo una funzione, può essere usato come argomento in altre funzioni:

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))

Risultati in:

['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
Puoi usare la formattazione vecchio stile con la mapstessa facilità con cui formatta. map('some_format_string_%s'.__mod__, some_iterable)
AGF

3
@cfi: per favore prova che hai ragione riscrivendo l'esempio sopra in C99
MarcH,

9
@MarcH: printf("%2$s %1$s\n", "One", "Two");compilato con gcc -std=c99 test.c -o test, l'output è Two One. Ma sono corretto: in realtà è un'estensione POSIX e non C. Non riesco a trovarlo di nuovo nello standard C / C ++, dove pensavo di averlo visto. Il codice funziona anche con il flag std 'c90'. sprintfpagina man . Questo non lo elenca, ma consente alle librerie di implementare un superset. Il mio argomento originale è ancora valido, sostituendo CconPosix
cfi il

8
Il mio primo commento qui, non si applica a questa risposta. Mi dispiace per il fraseggio. In Python non possiamo usare l'operatore modulo %per riordinare i segnaposto. Vorrei ancora non cancellare quel primo commento per motivi di coerenza dei commenti qui. Chiedo scusa per aver sfogato la mia rabbia qui. È diretto contro l'affermazione spesso fatta che la vecchia sintassi di per sé non lo permetterebbe. Invece di creare una sintassi completamente nuova avremmo potuto introdurre le estensioni Posd standard. Potremmo avere entrambi.
cfi,

17
'modulo' si riferisce all'operatore che valuta un resto dopo una divisione. in questo caso il segno di percentuale non è un operatore modulo.
Polpo

148

Supponendo che tu stia utilizzando il loggingmodulo di Python , puoi passare gli argomenti di formattazione delle stringhe come argomenti al .debug()metodo piuttosto che eseguire tu stesso la formattazione:

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

che evita di eseguire la formattazione a meno che il logger non registri effettivamente qualcosa.


10
Queste sono alcune informazioni utili che ho appena imparato ora. È un peccato che non abbia una sua domanda in quanto sembra separata dalla domanda principale. Peccato che l'OP non abbia diviso la sua domanda in due domande separate.
snth

12
Puoi usare la formattazione di dict in questo modo: log.debug("some debug info: %(this)s and %(that)s", dict(this='Tom', that='Jerry')) Tuttavia, non puoi usare la nuova .format()sintassi dello stile qui, nemmeno in Python 3.3, il che è un peccato.
Cito,


26
Il vantaggio principale di ciò non è la prestazione (l'esecuzione dell'interpolazione di stringhe sarà rapida rispetto a qualsiasi cosa tu stia facendo con l'output dalla registrazione, ad es. Visualizzazione in un terminale, salvataggio su disco) È che se hai un aggregatore di registrazione, esso può dirti "hai ricevuto 12 istanze di questo messaggio di errore", anche se tutti avevano valori "some_info" diversi. Se la formattazione della stringa viene eseguita prima di passare la stringa a log.debug, questo è impossibile. L'aggregatore può solo dire "hai avuto 12 messaggi di registro diversi"
Jonathan Hartley,

7
Se sei preoccupato per le prestazioni, usa la sintassi letterale dict {} anziché un'istanza della classe dict (): doughellmann.com/2012/11/…
trojjer

119

A partire da Python 3.6 (2016) puoi usare f-string per sostituire le variabili:

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

Nota il f"prefisso. Se provi questo in Python 3.5 o precedente, otterrai un SyntaxError.

Vedi https://docs.python.org/3.6/reference/lexical_analysis.html#f-strings


1
Questo non risponde alla domanda. Un'altra risposta che menziona almeno le f-string parla di prestazioni: stackoverflow.com/a/51167833/7851470
Georgy,

60

PEP 3101 propone la sostituzione %dell'operatore con la nuova formattazione avanzata delle stringhe in Python 3, dove sarebbe l'impostazione predefinita.


14
Non vero: "La compatibilità con le versioni precedenti può essere mantenuta lasciando in atto i meccanismi esistenti."; ovviamente, .formatnon sostituirà % la formattazione delle stringhe.
Tobias,

12
No, la postulazione di BrainStorms è vera: "intesa come sostituto dell'attuale '%'". La citazione di Tobias significa che entrambi i sistemi coesisteranno per un po 'di tempo. RTFPEP
phobie,

54

Ma attenzione, ho appena scoperto un problema quando ho provato a sostituire tutto %con il .formatcodice esistente: '{}'.format(unicode_string)proverò a codificare unicode_string e probabilmente fallirà.

Guarda questo registro delle sessioni interattive di 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è solo una stringa (chiamata 'array di byte' in Python3) ed uè una stringa Unicode (chiamata 'stringa' in Python3):

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

Quando si assegna un oggetto Unicode come parametro %all'operatore, verrà prodotta una stringa Unicode anche se la stringa originale non era Unicode:

; '{}'.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)

ma la .formatfunzione genererà "UnicodeEncodeError":

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

e funzionerà bene con un argomento Unicode solo se la stringa originale era Unicode.

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

o se la stringa dell'argomento può essere convertita in una stringa (il cosiddetto "array di byte")


12
Semplicemente non c'è motivo di cambiare il codice di lavoro a meno che le funzionalità aggiuntive del nuovo formatmetodo non siano davvero necessarie ...
Tobias,

assolutamente d'accordo con te, Tobias, ma a volte è necessario per l'aggiornamento alle versioni più recenti di Python
wobmene,

2
Per esempio? AFAIK, non è mai stato necessario; Non ritengo probabile che l' %interpolazione delle stringhe possa mai andare via.
Tobias,

4
Considero la funzione .format () più sicura di% per le stringhe. Vedo spesso errori dei principianti come questo "p1=%s p2=%d" % "abc", 2o "p1=%s p2=%s" % (tuple_p1_p2,). Potresti pensare che sia colpa del programmatore, ma penso che sia solo una strana sintassi difettosa che sembra piacevole per la sceneggiatura veloce ma è cattiva per il codice di produzione.
Wobmene,

3
Ma non mi piace la sintassi di .format (), sarei più felice con il buon vecchio %s, %02dcome "p1=%s p2=%02d".format("abc", 2). Incolpo chi ha inventato e approvato la formattazione delle parentesi graffe che ha bisogno di te per sfuggire a loro {{}}e sembra brutta imho.
Wobmene,

35

Ancora un altro vantaggio di .format(che non vedo nelle risposte): può prendere le proprietà degli oggetti.

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'

Oppure, come argomento per parole chiave:

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

Questo non è possibile %per quanto ne so.


4
Sembra più illeggibile del necessario rispetto all'equivalente 'x is {0}, y is {1}'.format(a.x, a.y). Dovrebbe essere usato solo quando l' a.xoperazione è molto costosa.
Dtheodor,

13
@dtheodor Con un tweak per usare un argomento parola chiave invece di argomento posizionale ... 'x is {a.x}, y is {a.y}'.format(a=a). Più leggibile di entrambi gli esempi.
CivFan,

1
@CivFan Oppure, se hai più di un oggetto,'x is {a.x}, y is {a.y}'.format(**vars())
Jack

1
Da notare anche questo nello stesso modo: '{foo[bar]}'.format(foo={'bar': 'baz'}).
Antoine Pinsard,

3
Ciò è incredibilmente utile per le applicazioni rivolte al cliente, in cui l'applicazione fornisce un set standard di opzioni di formattazione con una stringa di formato fornita dall'utente. Lo uso sempre. Il file di configurazione, ad esempio, avrà alcune proprietà di "messagestring", che l'utente può fornire 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}o qualunque cosa desideri. Questo è molto più pulito rispetto al tentativo di offrire la stessa funzionalità con il vecchio formattatore. Rende le stringhe di formato fornite dall'utente molto più potenti.
Taywee,

35

%offre prestazioni migliori rispetto formatal mio test.

Codice di prova:

Python 2.7.2:

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

Risultato:

> format: 0.470329046249
> %: 0.357107877731

Python 3.5.2

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

Risultato

> format: 0.5864730989560485
> %: 0.013593495357781649

Sembra in Python2, la differenza è piccola mentre in Python3 %è molto più veloce di format.

Grazie @ Chris Cogdon per il codice di esempio.

Modifica 1:

Testato di nuovo in Python 3.7.2 a luglio 2019.

Risultato:

> format: 0.86600608
> %: 0.630180146

Non c'è molta differenza. Immagino che Python stia migliorando gradualmente.

Modifica 2:

Dopo che qualcuno ha menzionato la stringa F di Python 3 nei commenti, ho fatto un test per il seguente codice in 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\"}'"))

Risultato:

format: 0.8331376779999999
%: 0.6314778750000001
f-string: 0.766649943

Sembra che f-string sia ancora più lento di %ma migliore di format.


42
Offre invece str.formatpiù funzionalità (in particolare la formattazione specializzata in tipi, ad esempio '{0:%Y-%m-%d}'.format(datetime.datetime.utcnow())). Le prestazioni non possono essere il requisito assoluto di tutti i lavori. Usa lo strumento giusto per il lavoro.
minhee,

36
"L'ottimizzazione prematura è la radice di tutti i mali" o almeno così diceva una volta Donald Knuth ...
Yatharth Agarwal,

22
Attenersi a un noto schema di formattazione (purché soddisfi le esigenze, cosa che fa nella stragrande maggioranza dei casi) e che è due volte più veloce, non è una "ottimizzazione prematura" ma semplicemente ragionevole. A proposito, l' %operatore consente di riutilizzare la printfconoscenza; l'interpolazione del dizionario è un'estensione molto semplice del principio.
Tobias,

5
In realtà ho sperimentato il contrario in una situazione. La formattazione di nuovo stile era più veloce. Puoi fornire il codice di prova che hai usato?
David Sanders,

8
Sembra un post seriamente sprecato senza alcun esempio o ragionamento, solo affermazioni.
kevr,

31

Come ho scoperto oggi, il vecchio modo di formattare le stringhe tramite %non supporta Decimal, il modulo di Python per il punto decimale e l'aritmetica in virgola mobile, pronto all'uso.

Esempio (usando 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))

Produzione:

0,00000000000000000000000312375239000000009907464850 0.0000000000000000000000031237523900000000000000000000

Potrebbero esserci sicuramente delle soluzioni, ma potresti comunque considerare di usare subito il format()metodo.


1
Questo probabilmente perché la formattazione di nuovo stile chiama str(d)prima di espandere il parametro, mentre la formattazione di vecchio stile probabilmente chiama per float(d)prima.
David Sanders,

3
Si potrebbe pensare così, ma str(d)i rendimenti "3.12375239e-24", non"0.00000000000000000000000312375239000000000000000000"
Jack

18

Se il tuo python> = 3.6, letterale in formato F string è il tuo nuovo amico.

È più semplice, pulito e con prestazioni migliori.

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

Come nota a margine, non è necessario subire un calo delle prestazioni per utilizzare la formattazione del nuovo stile con la registrazione. È possibile passare qualsiasi oggetto a logging.debug, logging.infoe così via che implementa il __str__metodo magico. Quando il modulo di registrazione ha deciso che deve emettere l'oggetto messaggio (qualunque esso sia), chiama str(message_object)prima di farlo. Quindi potresti fare qualcosa del genere:

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))

Tutto ciò è descritto nella documentazione di Python 3 ( https://docs.python.org/3/howto/logging-cookbook.html#formatting-styles ). Tuttavia, funzionerà anche con Python 2.6 ( https://docs.python.org/2.6/library/logging.html#using-arbitrary-objects-as-messages ).

Uno dei vantaggi dell'utilizzo di questa tecnica, oltre al fatto che è agnostico in stile formattazione, è che consente valori pigri, ad esempio la funzione expensive_funcsopra. Ciò fornisce un'alternativa più elegante ai consigli forniti nei documenti Python qui: https://docs.python.org/2.6/library/logging.html#optimization .


2
Vorrei poter votare di più. Permette di accedere formatsenza il colpo di prestazione - lo fa sovrascrivendo __str__esattamente come è loggingstato progettato per - accorcia la chiamata di funzione a una singola lettera ( N) che sembra molto simile ad alcuni dei modi standard per definire le stringhe - E consente pigri chiamata di funzione. Grazie! +1
CivFan,

2
Questo è diverso nel risultato dell'uso del logging.Formatter(style='{')parametro?
David,

10

Una situazione in cui %può essere d'aiuto è quando si formattano espressioni regex. Per esempio,

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

solleva IndexError. In questa situazione, puoi usare:

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

Questo evita di scrivere regex come '{type_names} [a-z]{{2}}'. Questo può essere utile quando hai due regex, dove una viene usata da sola senza formattazione, ma la concatenazione di entrambe è formattata.


3
O semplicemente usa '{type_names} [a-z]{{2}}'.format(type_names='triangle|square'). È come dire .format()può essere d'aiuto quando si usano stringhe che contengono già un carattere percentuale. Sicuro. Allora devi scappare da loro.
Alfe

1
@Alfe Hai ragione, ed è per questo che la risposta inizia con "One situation where % may help is when you are formatting regex expressions."In particolare, supponiamo che a=r"[a-z]{2}"sia un pezzo regex che verrai usato in due diverse espressioni finali (es. c1 = b + aE c2 = a). Supponiamo che c1debba essere modificato format(ad es. bDeve essere formattato in fase di esecuzione), ma c2non lo è. Quindi hai bisogno a=r"[a-z]{2}"per c2e a=r"[a-z]{{2}}"per c1.format(...).
Jorge Leitao,

7

Vorrei aggiungere che dalla versione 3.6, possiamo usare fstrings come il seguente

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

Che danno

Mi chiamo John Smith

Tutto viene convertito in stringhe

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

Risultato:

mylist = ['foo', 'bar']

puoi passare la funzione, come nel metodo di altri formati

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

Dare per esempio

Ciao, ecco la data: 16/04/2018


4

Per la versione python> = 3.6 (vedi PEP 498 )

s1='albha'
s2='beta'

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

#output
'albha      beta'

2

Comparativo Python 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()

Produzione:

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
Dovresti eseguire ogni esempio più volte, una singola esecuzione potrebbe essere fuorviante, ad esempio il sistema operativo potrebbe essere generalmente occupato, quindi l'esecuzione del codice viene ritardata. consultare la documentazione: docs.python.org/3/library/timeit.html . (bel avatar, Guybrush!)
jake77

1

Ma una cosa è che anche se hai parentesi graffe nidificate, non funzionerà per il formato ma %funzionerà.

Esempio:

>>> '{{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
potresti farlo, ma concordo sul fatto che è un formato "{{{0}, {1}}}". (1, 2)
Sylvan LE DEUNFF,

Le parentesi graffe di parole chiave nidificate funzionano e sono carine.
CivFan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.