Lo faccio in Python 2:
"(%d goals, $%d)" % (self.goals, self.penalties)
Qual è la versione Python 3 di questo?
Ho provato a cercare esempi online ma ho continuato a ricevere le versioni di Python 2.
Lo faccio in Python 2:
"(%d goals, $%d)" % (self.goals, self.penalties)
Qual è la versione Python 3 di questo?
Ho provato a cercare esempi online ma ho continuato a ricevere le versioni di Python 2.
Risposte:
Ecco i documenti sulla sintassi del "nuovo" formato. Un esempio potrebbe essere:
"({:d} goals, ${:d})".format(self.goals, self.penalties)
Se entrambi goals
e penalties
sono numeri interi (cioè il loro formato predefinito è ok), potrebbe essere abbreviato in:
"({} goals, ${})".format(self.goals, self.penalties)
E poiché i parametri sono campi di self
, c'è anche un modo per farlo usando un singolo argomento due volte (come ha notato @Burhan Khalid nei commenti):
"({0.goals} goals, ${0.penalties})".format(self)
spiegazione:
{}
significa solo il successivo argomento posizionale, con il formato predefinito;{0}
indica l'argomento con indice 0
, con formato predefinito;{:d}
è il successivo argomento posizionale, con formato intero decimale;{0:d}
è l'argomento con indice 0
, con formato intero decimale.Ci sono molte altre cose che puoi fare quando selezioni un argomento (usando argomenti con nome invece di quelli posizionali, accedendo ai campi, ecc.) E anche molte opzioni di formato (riempire il numero, usare migliaia di separatori, mostrare segno o meno, ecc.). Alcuni altri esempi:
"({goals} goals, ${penalties})".format(goals=2, penalties=4)
"({goals} goals, ${penalties})".format(**self.__dict__)
"first goal: {0.goal_list[0]}".format(self)
"second goal: {.goal_list[1]}".format(self)
"conversion rate: {:.2f}".format(self.goals / self.shots) # '0.20'
"conversion rate: {:.2%}".format(self.goals / self.shots) # '20.45%'
"conversion rate: {:.0%}".format(self.goals / self.shots) # '20%'
"self: {!s}".format(self) # 'Player: Bob'
"self: {!r}".format(self) # '<__main__.Player instance at 0x00BF7260>'
"games: {:>3}".format(player1.games) # 'games: 123'
"games: {:>3}".format(player2.games) # 'games: 4'
"games: {:0>3}".format(player2.games) # 'games: 004'
Nota: come altri hanno sottolineato, il nuovo formato non sostituisce il primo, entrambi sono disponibili sia in Python 3 che nelle versioni più recenti di Python 2. Alcuni potrebbero dire che è una questione di preferenze, ma IMHO il più recente è molto più espressivo del vecchio e dovrebbe essere usato ogni volta che si scrive nuovo codice (a meno che non si rivolga ad ambienti più vecchi, ovviamente).
"({0.goals} goals, ${0.penalties})".format(self)
"conversion rate: {:.2%}".format(self.goals / self.shots)
? Funziona bene per me così com'è ... (Python 3.4) Nota che non c'è f
, sto chiedendo di formattare come percentuale, non come numero in virgola mobile.
"{:.2f}%".format(float_num)
funziona bene per entrambi.
$
non ha alcun significato speciale qui, né nella sintassi del vecchio formato né nel nuovo, quindi dovrebbe essere presente nella stringa generata, invariata.
Python 3.6 ora supporta l'interpolazione di stringhe letterali abbreviate con PEP 498 . Per il tuo caso d'uso, la nuova sintassi è semplicemente:
f"({self.goals} goals, ${self.penalties})"
Questo è simile allo .format
standard precedente , ma consente di fare facilmente cose come :
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal('12.34567')
>>> f'result: {value:{width}.{precision}}'
'result: 12.35'
Quella linea funziona così com'è in Python 3.
>>> sys.version
'3.2 (r32:88445, Oct 20 2012, 14:09:29) \n[GCC 4.5.2]'
>>> "(%d goals, $%d)" % (self.goals, self.penalties)
'(1 goals, $2)'
Mi piace questo approccio
my_hash = {}
my_hash["goals"] = 3 #to show number
my_hash["penalties"] = "5" #to show string
print("I scored %(goals)d goals and took %(penalties)s penalties" % my_hash)
Notare rispettivamente la d e la s alle parentesi.
l'output sarà:
I scored 3 goals and took 5 penalties