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

Lecture et affectation de variables

9 réponses
Avatar
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.

9 réponses

Avatar
Damien Wyart
* Alain BARTHE in fr.comp.lang.python:
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
Avatar
Alain BARTHE
Le 16/06/2011 23:10, Damien Wyart a écrit :
* Alain BARTHE in fr.comp.lang.python:
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.
Avatar
Pierre Maurette
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
Avatar
Alain Ketterlin
Alain BARTHE writes:

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.
Avatar
Alain BARTHE
Le 17/06/2011 09:45, Alain Ketterlin a écrit :
Alain BARTHE writes:

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.
Avatar
Alain BARTHE
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'>

Avatar
Alain BARTHE
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 !!!
Avatar
Pierre Maurette
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
Avatar
Alain BARTHE
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/ !