Lecture et affectation de variables

Le
Alain BARTHE
Bonjour,

Je dispose d'une fonction retournant une liste (ou d'un tuple si
nécessaire) composé d'un numéro, d'une date et d'une liste de fichiers
de taille variable.

Je pensais pouvoir écrire :

numero, date, fichiers, = ma_fonction()

Je croyais pouvoir affecter numero et date avec les 2 premieres valeurs
et fichiers avec les valeurs 3 à n.

Mais je tombe sur l'exception : ValueError: too many values to unpack

Je peux bien sur écrire :

liste = ma_fonction()
numero = liste [0]
date = liste [1]
fichiers = liste [2:]

Mais, j'aurais aimé faire ça en une ligne. Est-ce possible ?

Il me semblait avoir déjà fait un truc du genre, mais je confonds
peut-être avec un autre langage.

Merci d'avance pour vos conseils.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Damien Wyart
Le #23470241
* Alain BARTHE
Je pensais pouvoir écrire :

numero, date, fichiers, = ma_fonction()

Je croyais pouvoir affecter numero et date avec les 2 premieres
valeurs et fichiers avec les valeurs 3 à n.



En Python 3.0+, on peut faire :

numero, date, *fichiers = ma_fonction()

--
DW
Alain BARTHE
Le #23471051
Le 16/06/2011 23:10, Damien Wyart a écrit :
* Alain BARTHE
Je pensais pouvoir écrire :



numero, date, fichiers, = ma_fonction()



Je croyais pouvoir affecter numero et date avec les 2 premieres
valeurs et fichiers avec les valeurs 3 à n.



En Python 3.0+, on peut faire :

numero, date, *fichiers = ma_fonction()



Joli, c'est un truc comme ça que je cherchais, mais je suis toujours
sous Python 2.x... Dommage.

Merci.
Pierre Maurette
Le #23471231
Alain BARTHE, le 6/16/2011 a écrit :
Bonjour,

Je dispose d'une fonction retournant une liste (ou d'un tuple si nécessaire)
composé d'un numéro, d'une date et d'une liste de fichiers de taille
variable.

Je pensais pouvoir écrire :

numero, date, fichiers, = ma_fonction()

Je croyais pouvoir affecter numero et date avec les 2 premieres valeurs et
fichiers avec les valeurs 3 à n.

Mais je tombe sur l'exception : ValueError: too many values to unpack

Je peux bien sur écrire :

liste = ma_fonction()
numero = liste [0]
date = liste [1]
fichiers = liste [2:]

Mais, j'aurais aimé faire ça en une ligne. Est-ce possible ?

Il me semblait avoir déjà fait un truc du genre, mais je confonds peut-être
avec un autre langage.



J'ai du mal à comprendre votre problème. En faisant tourner:

import sys

print sys.version

def flisteliste(x):
return list((2*x, x*x, list(range(x))))

def ftupletuple(x):
return tuple((2*x, x*x, tuple(range(x))))

def flistetuple(x):
return list((2*x, x*x, tuple(range(x))))

def ftupleliste(x):
return tuple((2*x, x*x, list(range(x))))

for f in flisteliste, ftupletuple, flistetuple, ftupleliste:
a, b, c = f(5)
print f.__name__, ': ', a, b, c, type(c)

J'obtiens:

2.7 (r27:82525, Jul 4 2010, 07:43:08) [MSC v.1500 64 bit (AMD64)]
flisteliste : 10 25 [0, 1, 2, 3, 4] <type 'list'>
ftupletuple : 10 25 (0, 1, 2, 3, 4) <type 'tuple'>
flistetuple : 10 25 (0, 1, 2, 3, 4) <type 'tuple'>
ftupleliste : 10 25 [0, 1, 2, 3, 4] <type 'list'>

--
Pierre Maurette
Alain Ketterlin
Le #23471291
Alain BARTHE
Je dispose d'une fonction retournant une liste (ou d'un tuple si
nécessaire) composé d'un numéro, d'une date et d'une liste de fichiers
de taille variable.

Je pensais pouvoir écrire :

numero, date, fichiers, = ma_fonction()



Pas en python 2.x.

Ce n'est pas possible de modifier la fonction pour qu'elle retourne un
vrai tuple ? C'est-à-dire (n,d,[f,...]) plutôt que [n,d,f,...]

Sinon, utilise un helper :

def dispatch(l):
return (l[0],l[1],l[2:])

puis

n,d,f = dispatch(ma_fonction())

Si tu veux vraiment tout faire en une ligne

n,d,f = (lambda l: return l[0],l[1],l[2:])(ma_fonction())

-- Alain.
Alain BARTHE
Le #23471381
Le 17/06/2011 09:45, Alain Ketterlin a écrit :
Alain BARTHE
Je dispose d'une fonction retournant une liste (ou d'un tuple si
nécessaire) composé d'un numéro, d'une date et d'une liste de fichiers
de taille variable.

Je pensais pouvoir écrire :

numero, date, fichiers, = ma_fonction()



Pas en python 2.x.

Ce n'est pas possible de modifier la fonction pour qu'elle retourne un
vrai tuple ? C'est-à-dire (n,d,[f,...]) plutôt que [n,d,f,...]



Si bien sur, c'est moi qui gère la fonction dans ce cas précis

C'est plutôt un problème "existentiel" que réellement bloquant.

Il me semblait juste avoir déjà utilisé un truc comme :

v1, v2, reste = [ 1, 2, 3, 4, 5, 6 ]

Avec :
v1 <= 1
v2 <= 2
reste <= [3,4,5,6]

Peut-être que je me trompe et que j'avais fait ca en shell Unix avec
read par exemple.

Merci pour votre aide.



Sinon, utilise un helper :

def dispatch(l):
return (l[0],l[1],l[2:])

puis

n,d,f = dispatch(ma_fonction())

Si tu veux vraiment tout faire en une ligne

n,d,f = (lambda l: return l[0],l[1],l[2:])(ma_fonction())

-- Alain.
Alain BARTHE
Le #23471371
Le 17/06/2011 09:25, Pierre Maurette a écrit :
Alain BARTHE, le 6/16/2011 a écrit :
Bonjour,

Je dispose d'une fonction retournant une liste (ou d'un tuple si
nécessaire) composé d'un numéro, d'une date et d'une liste de fichiers
de taille variable.

Je pensais pouvoir écrire :

numero, date, fichiers, = ma_fonction()

Je croyais pouvoir affecter numero et date avec les 2 premieres
valeurs et fichiers avec les valeurs 3 à n.

Mais je tombe sur l'exception : ValueError: too many values to unpack

Je peux bien sur écrire :

liste = ma_fonction()
numero = liste [0]
date = liste [1]
fichiers = liste [2:]

Mais, j'aurais aimé faire ça en une ligne. Est-ce possible ?

Il me semblait avoir déjà fait un truc du genre, mais je confonds
peut-être avec un autre langage.



J'ai du mal à comprendre votre problème. En faisant tourner:



j'aurais du donner un exemple. Dans ma question la fonction retourne une
liste "à plat"

Je voulais faire par exemple :

a,b,c = [ 1, 2, 3, 4 ,5, 6]

et affecter :
a = 1
b = 2
c = [3,4,5,6]

Je croyais avoir déjà fait un truc du genre mais je m'étais surement trompe.

Merci.


import sys

print sys.version

def flisteliste(x):
return list((2*x, x*x, list(range(x))))

def ftupletuple(x):
return tuple((2*x, x*x, tuple(range(x))))

def flistetuple(x):
return list((2*x, x*x, tuple(range(x))))

def ftupleliste(x):
return tuple((2*x, x*x, list(range(x))))

for f in flisteliste, ftupletuple, flistetuple, ftupleliste:
a, b, c = f(5)
print f.__name__, ': ', a, b, c, type(c)

J'obtiens:

2.7 (r27:82525, Jul 4 2010, 07:43:08) [MSC v.1500 64 bit (AMD64)]
flisteliste : 10 25 [0, 1, 2, 3, 4] <type 'list'>
ftupletuple : 10 25 (0, 1, 2, 3, 4) <type 'tuple'>
flistetuple : 10 25 (0, 1, 2, 3, 4) <type 'tuple'>
ftupleliste : 10 25 [0, 1, 2, 3, 4] <type 'list'>

Alain BARTHE
Le #23471561
Si tu veux vraiment tout faire en une ligne

n,d,f = (lambda l: return l[0],l[1],l[2:])(ma_fonction())

-- Alain.



J'avais pas lu la suite. J'adore les lambda !!!
Pierre Maurette
Le #23472381
Alain BARTHE, le 6/17/2011 a écrit :
Le 17/06/2011 09:25, Pierre Maurette a écrit :
Alain BARTHE, le 6/16/2011 a écrit :
Bonjour,

Je dispose d'une fonction retournant une liste (ou d'un tuple si
nécessaire) composé d'un numéro, d'une date et d'une liste de fichiers
de taille variable.

Je pensais pouvoir écrire :

numero, date, fichiers, = ma_fonction()

Je croyais pouvoir affecter numero et date avec les 2 premieres
valeurs et fichiers avec les valeurs 3 à n.

Mais je tombe sur l'exception : ValueError: too many values to unpack

Je peux bien sur écrire :

liste = ma_fonction()
numero = liste [0]
date = liste [1]
fichiers = liste [2:]

Mais, j'aurais aimé faire ça en une ligne. Est-ce possible ?

Il me semblait avoir déjà fait un truc du genre, mais je confonds
peut-être avec un autre langage.



J'ai du mal à comprendre votre problème. En faisant tourner:



j'aurais du donner un exemple. Dans ma question la fonction retourne une
liste "à plat"

Je voulais faire par exemple :

a,b,c = [ 1, 2, 3, 4 ,5, 6]

et affecter :
a = 1
b = 2
c = [3,4,5,6]

Je croyais avoir déjà fait un truc du genre mais je m'étais surement trompe.



Je me doutais bien que je passais à coté d'un truc. Surtout sachant qui
avait posé la question. ;-)
Ce qui me troublait, c'était le "(ou d'un tuple si nécessaire)" qui
indiquait que vous êtiez maître de la fonction. Maintenant j'ai lu plus
bas qu'il s'agissait avant tout /de ne pas mourir idiot/ !

--
Pierre Maurette
Alain BARTHE
Le #23472561
Le 17/06/2011 13:16, Pierre Maurette a écrit :
Alain BARTHE, le 6/17/2011 a écrit :
Le 17/06/2011 09:25, Pierre Maurette a écrit :
Alain BARTHE, le 6/16/2011 a écrit :
Bonjour,

Je dispose d'une fonction retournant une liste (ou d'un tuple si
nécessaire) composé d'un numéro, d'une date et d'une liste de fichiers
de taille variable.

Je pensais pouvoir écrire :

numero, date, fichiers, = ma_fonction()

Je croyais pouvoir affecter numero et date avec les 2 premieres
valeurs et fichiers avec les valeurs 3 à n.

Mais je tombe sur l'exception : ValueError: too many values to unpack

Je peux bien sur écrire :

liste = ma_fonction()
numero = liste [0]
date = liste [1]
fichiers = liste [2:]

Mais, j'aurais aimé faire ça en une ligne. Est-ce possible ?

Il me semblait avoir déjà fait un truc du genre, mais je confonds
peut-être avec un autre langage.



J'ai du mal à comprendre votre problème. En faisant tourner:



j'aurais du donner un exemple. Dans ma question la fonction retourne
une liste "à plat"

Je voulais faire par exemple :

a,b,c = [ 1, 2, 3, 4 ,5, 6]

et affecter :
a = 1
b = 2
c = [3,4,5,6]

Je croyais avoir déjà fait un truc du genre mais je m'étais surement
trompe.



Je me doutais bien que je passais à coté d'un truc. Surtout sachant qui
avait posé la question. ;-)



J'ai si mauvaise réputation ?

Ce qui me troublait, c'était le "(ou d'un tuple si nécessaire)" qui
indiquait que vous êtiez maître de la fonction. Maintenant j'ai lu plus
bas qu'il s'agissait avant tout /de ne pas mourir idiot/ !

Publicité
Poster une réponse
Anonyme