J'essaie de faire exactement ce qui suit:
>>> x = (1,2)
>>> y = 'hello'
>>> '%d,%d,%s' % (x[0], x[1], y)
'1,2,hello'
Cependant, j'ai un long x
, plus de deux éléments, j'ai donc essayé:
>>> '%d,%d,%s' % (*x, y)
mais c'est une erreur de syntaxe. Quelle serait la bonne façon de procéder sans indexation comme le premier exemple?
str % ..
accepte un Tuple comme opérande de droite, vous pouvez donc effectuer les opérations suivantes:
>>> x = (1, 2)
>>> y = 'hello'
>>> '%d,%d,%s' % (x + (y,)) # Building a Tuple of `(1, 2, 'hello')`
'1,2,hello'
Votre essai devrait fonctionner dans Python 3. où Additional Unpacking Generalizations
est pris en charge, mais pas dans Python 2.x:
>>> '%d,%d,%s' % (*x, y)
'1,2,hello'
Jetez un œil à str.format () .
>>> x = (5,7)
>>> template = 'first: {}, second: {}'
>>> template.format(*x)
'first: 5, second: 7'
Pour être complet, j'inclus également généralisations de déballage supplémentaires décrites par PEP 448 . La syntaxe étendue a été introduite dans Python 3.5 , et ce qui suit n'est plus une erreur de syntaxe:
>>> x = (5, 7)
>>> y = 42
>>> template = 'first: {}, second: {}, last: {}'
>>> template.format(*x, y) # valid in Python3.5+
'first: 5, second: 7, last: 42'
Dans Python 3.4 et inférieur , cependant, si vous voulez passer des arguments supplémentaires après le tuple décompressé, il vaut probablement mieux les passer comme arguments nommés:
>>> x = (5, 7)
>>> y = 42
>>> template = 'first: {}, second: {}, last: {last}'
>>> template.format(*x, last=y)
'first: 5, second: 7, last: 42'
Cela évite d'avoir à construire un nouveau Tuple contenant un élément supplémentaire à la fin.
Je vous suggère d'utiliser str.format
au lieu str %
car il est "plus moderne" et possède également un meilleur ensemble de fonctionnalités. Cela dit, ce que vous voulez, c'est:
>>> x = (1,2)
>>> y = 'hello'
>>> '{},{},{}'.format(*(x + (y,)))
1,2,hello
Pour toutes les fonctionnalités intéressantes de format
(et certaines liées à %
également) jetez un œil à PyFormat .