Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Petite question sur les tuples

11 réponses
Avatar
Alain BARTHE
Bonjour,

Petite question existentielle concernant les tuples et l'"opérateur" * :

je voudrais imprimer suivant le format frm = "%s %d %d %d %d"
les valeurs suivantes:
- une date
- 4 décimaux contenus dans un tableau tot[]

Or, print prend en argument un tuple.

J'ai donc essaye :

print frm % (date, tuple (tot))

Mais ca ne marche pas : cree le tuple ("2001-01-01", (10,20,30,40))

J'ai donc essayé aussi :

print frm % (date, * tuple(tot))
print frm % (date, *tot)

Mais ca ne marche pas non plus : erreur de syntaxe

Ce qui marche :

print frm % tuple ([date] + tot)




Par contre, si je fais :
d = [2010,4,30]

datetime.date (d) => erreur disant que date attend un tuple d'arguments

datetime.date (*d) => fonctionne

Si j'ai bien compris, *d passe les valeurs du tableau comme une "suite"
(je sais pas le terme exact) de parametres a la fonction date

Je voudrais savoir pourquoi *tot est rejete par print(), mais accepte
par date()

Cela vient-il de la signature de la fonction print() ?
Où trouver la doc de cet opérateur * ?
Je n'ai jamais rien vu là dessus, hormis dans des exemples de code.

10 réponses

1 2
Avatar
Alain Ketterlin
Alain BARTHE writes:

je voudrais imprimer suivant le format frm = "%s %d %d %d %d"

print frm % (date, tuple (tot))

Mais ca ne marche pas : cree le tuple ("2001-01-01", (10,20,30,40))

print frm % (date, * tuple(tot))
print frm % (date, *tot)

Mais ca ne marche pas non plus : erreur de syntaxe
Ce qui marche :

print frm % tuple ([date] + tot)

Par contre, si je fais :
d = [2010,4,30]

datetime.date (d) => erreur disant que date attend un tuple d'arguments
datetime.date (*d) => fonctionne

Si j'ai bien compris, *d passe les valeurs du tableau comme une
"suite" (je sais pas le terme exact) de parametres a la fonction date



La solution est là : il y a un appel de fonction. C'est pour l'appel q ue
* permet de transformer une séquence en une liste de paramètres.

Je voudrais savoir pourquoi *tot est rejete par print(), mais accepte
par date()



Il n'y a pas d'appel au moment où tu fais *tot, parce que cela appara ît
dans une expression (date,*tot) ou ce n'est pas syntaxiquement correct.
Si tu écris toi-même la fonction :

def monprint(d,v1,v2,v3):
print "%s %d %d %d" % (d,v1,v2,v3)

et que tu appelles monprint(date,*tat), alors tout se passe bien.

Où trouver la doc de cet opérateur * ?



Language reference, section Function definitions.

-- Alain.
Avatar
Alain BARTHE
Alain Ketterlin a écrit :
Alain BARTHE writes:

je voudrais imprimer suivant le format frm = "%s %d %d %d %d"



print frm % (date, tuple (tot))

Mais ca ne marche pas : cree le tuple ("2001-01-01", (10,20,30,40))



print frm % (date, * tuple(tot))
print frm % (date, *tot)

Mais ca ne marche pas non plus : erreur de syntaxe
Ce qui marche :

print frm % tuple ([date] + tot)



Par contre, si je fais :
d = [2010,4,30]

datetime.date (d) => erreur disant que date attend un tuple d'arguments
datetime.date (*d) => fonctionne

Si j'ai bien compris, *d passe les valeurs du tableau comme une
"suite" (je sais pas le terme exact) de parametres a la fonction date



La solution est là : il y a un appel de fonction. C'est pour l'appel que
* permet de transformer une séquence en une liste de paramètres.



OK
Apparemment print() est une fonction "builtin" qui doit avoir une
signature différente des fonctions classiques.
Elle attend un scalaire ou tuple après le % et pas une suite d'arguments.

Je voudrais savoir pourquoi *tot est rejete par print(), mais accepte
par date()



Il n'y a pas d'appel au moment où tu fais *tot, parce que cela apparaît
dans une expression (date,*tot) ou ce n'est pas syntaxiquement correct.
Si tu écris toi-même la fonction :

def monprint(d,v1,v2,v3):
print "%s %d %d %d" % (d,v1,v2,v3)

et que tu appelles monprint(date,*tat), alors tout se passe bien.

Où trouver la doc de cet opérateur * ?



Language reference, section Function definitions.



OK merci,je vais y jeter un coup d'oeil

-- Alain.
Avatar
Alain Ketterlin
Alain BARTHE writes:

print frm % (date, *tot)





Apparemment print() est une fonction "builtin" qui doit avoir une
signature différente des fonctions classiques.
Elle attend un scalaire ou tuple après le % et pas une suite d'argum ents.



Juste un détail : dans le cas ci-dessus, print est une instruction que
tu utilises avec un seul argument, une chaîne de caractères. Le % est un
opérateur qui construit d'abord la chaîne, puis print est appel é avec le
résultat. C'est en substance la même chose que :

s = frm % tuple (date,*tot)
print s

(qui n'est pas correct). L'instruction print peut prendre plusieurs
paramètres, mais il ne semble pas qu'on puisse y faire ce que tu veux.

En python 3 ce serait la même chose tant que tu utilises %, mais comme
print devient une fonction, il doit être possible de faire :

print(date,*tot)

mais on n'a pas le format. Par contre, dès que tu utilises %, tu ne pe ux
plus profiter de cela (% agira avant print).

Autre solution : passer par string.format, quelque chose du genre :

"{0} {1} {2} {3}".format(date,*tot)

Du coup, c'est l'appel de format() qui s'occupe de déplier ta liste.

-- Alain.
Avatar
News123
Alain BARTHE wrote:
Bonjour,

Petite question existentielle concernant les tuples et l'"opérateur" * :

je voudrais imprimer suivant le format frm = "%s %d %d %d %d"
les valeurs suivantes:
- une date
- 4 décimaux contenus dans un tableau tot[]

Or, print prend en argument un tuple.

J'ai donc essaye :

print frm % (date, tuple (tot))

Mais ca ne marche pas : cree le tuple ("2001-01-01", (10,20,30,40))

J'ai donc essayé aussi :

print frm % (date, * tuple(tot))
print frm % (date, *tot)



print fmtt % ( (date,) + tuple(tot))
devrait marcher

example similaire:
t=(1,2,3)
a=3
"%d %d %d %d" % ((a,)+t)






'3 1 2 3'








bye


N
Avatar
Alain BARTHE
News123 a écrit :
Alain BARTHE wrote:
Bonjour,

Petite question existentielle concernant les tuples et l'"opérateur" * :

je voudrais imprimer suivant le format frm = "%s %d %d %d %d"
les valeurs suivantes:
- une date
- 4 décimaux contenus dans un tableau tot[]

Or, print prend en argument un tuple.

J'ai donc essaye :

print frm % (date, tuple (tot))

Mais ca ne marche pas : cree le tuple ("2001-01-01", (10,20,30,40))

J'ai donc essayé aussi :

print frm % (date, * tuple(tot))
print frm % (date, *tot)




print fmtt % ( (date,) + tuple(tot))
devrait marcher




Effectivement, ça fonctionne :
(date,) cree un premier tuple, qui est concaténé au second
et le tout est passé à "fmt %" puis au print

Joli !
Syntaxe un peu complexe tout de même.



example similaire:
t=(1,2,3)
a=3
"%d %d %d %d" % ((a,)+t)






'3 1 2 3'

bye


N
Avatar
News123
Alain BARTHE wrote:
print fmtt % ( (date,) + tuple(tot))
devrait marcher




Effectivement, ça fonctionne :
(date,) cree un premier tuple, qui est concaténé au second
et le tout est passé à "fmt %" puis au print

Joli !
Syntaxe un peu complexe tout de même.


Je suis d'accord. :-(
Dis moi si tu trouve mieux.
Pour l'instance c'est ma facon de coder, mais j'aurais rien contre
quelquechose plus agreeable.

N




example similaire:
t=(1,2,3)
a=3
"%d %d %d %d" % ((a,)+t)






'3 1 2 3'

bye


N
Avatar
Alain BARTHE
News123 a écrit :
Alain BARTHE wrote:
print fmtt % ( (date,) + tuple(tot))
devrait marcher



Effectivement, ça fonctionne :
(date,) cree un premier tuple, qui est concaténé au second
et le tout est passé à "fmt %" puis au print

Joli !
Syntaxe un peu complexe tout de même.


Je suis d'accord. :-(
Dis moi si tu trouve mieux.
Pour l'instance c'est ma facon de coder, mais j'aurais rien contre
quelquechose plus agreeable.

N



Euréka, il suffisait de :

print fmt %((date,) + (lambda *x:x)(*tot))

C'est beaucoup plus clair !!!



example similaire:
t=(1,2,3)
a=3
"%d %d %d %d" % ((a,)+t)






'3 1 2 3'

bye


N
Avatar
Bruno Desthuilliers
Alain BARTHE a écrit :
News123 a écrit :
Alain BARTHE wrote:
print fmtt % ( (date,) + tuple(tot))
devrait marcher



Effectivement, ça fonctionne :
(date,) cree un premier tuple, qui est concaténé au second
et le tout est passé à "fmt %" puis au print

Joli !
Syntaxe un peu complexe tout de même.







???

Je suis d'accord. :-(
Dis moi si tu trouve mieux.
Pour l'instance c'est ma facon de coder, mais j'aurais rien contre
quelquechose plus agreeable.

N



Euréka, il suffisait de :

print fmt %((date,) + (lambda *x:x)(*tot))

C'est beaucoup plus clair !!!





On doit pas avoir la même définition de "clair" alors. Perso, je tombe
là-dessus dans un code, je perd au moins 10 minutes à me demander
POURQUOI... avant éventuellement de le réécrire de la façon simple et
évidente mentionnée ci-avant.

Enfin bon, mon avis perso, etc etc...
Avatar
Alain BARTHE
Bruno Desthuilliers a écrit :
Alain BARTHE a écrit :
News123 a écrit :
Alain BARTHE wrote:
print fmtt % ( (date,) + tuple(tot))
devrait marcher



Effectivement, ça fonctionne :
(date,) cree un premier tuple, qui est concaténé au second
et le tout est passé à "fmt %" puis au print

Joli !
Syntaxe un peu complexe tout de même.







???


J'ai eu du mal à me rappeler du ((date,) qui crée un tuple singleton
auquel on concatène un autre tuple.

Et puis, j'ai dit "un peu" complexe.

Je ne voulais vexer personne, surtout pas News123 qui a pris du temps
pour donner sa solution du problème.


Je suis d'accord. :-(
Dis moi si tu trouve mieux.
Pour l'instance c'est ma facon de coder, mais j'aurais rien contre
quelquechose plus agreeable.

N



Euréka, il suffisait de :

print fmt %((date,) + (lambda *x:x)(*tot))

C'est beaucoup plus clair !!!





Il m'arrive aussi de faire du second degré...

Désolé si ça a été mal interprété.


On doit pas avoir la même définition de "clair" alors. Perso, je tombe
là-dessus dans un code, je perd au moins 10 minutes à me demander
POURQUOI... avant éventuellement de le réécrire de la façon simple et
évidente mentionnée ci-avant.

Enfin bon, mon avis perso, etc etc...

Avatar
Bruno Desthuilliers
Alain BARTHE a écrit :
Bruno Desthuilliers a écrit :
Alain BARTHE a écrit :
News123 a écrit :
Alain BARTHE wrote:
print fmtt % ( (date,) + tuple(tot))
devrait marcher



Effectivement, ça fonctionne :
(date,) cree un premier tuple, qui est concaténé au second
et le tout est passé à "fmt %" puis au print

Joli !
Syntaxe un peu complexe tout de même.







???


J'ai eu du mal à me rappeler du ((date,) qui crée un tuple singleton
auquel on concatène un autre tuple.



Ah, ok.


Euréka, il suffisait de :

print fmt %((date,) + (lambda *x:x)(*tot))

C'est beaucoup plus clair !!!





Il m'arrive aussi de faire du second degré...



oops, désolé.

Désolé si ça a été mal interprété.



Non, c'est moi.
1 2