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

définir des listes dans une fonction

9 réponses
Avatar
Philippe Makowski
Bonjour,

je débute en Python et j'ai un probleme tout bête

je dois redéfinir des listes dans une boucle
si dans ma boucle je fait :

valeurs = [
( unicode('Année','iso-8859-1'), 'Biens TF', 'Biens non
TF',
'Base brute', unicode('Somme à payer','iso-8859-1'),
unicode('Nb établissements','iso-8859-1') )
]
moyenne = [
( unicode('Année','iso-8859-1'),
'Biens TF\n entreprise', 'Biens TF\n ensemble',
'Biens non TF\n entreprise', 'Biens non TF\n ensemble',
'Base brute\n entreprise', 'Base brute\n ensemble',
unicode('Somme à payer\n entreprise','iso-8859-1'),
unicode('Somme à payer\n ensemble','iso-8859-1')
)
]
et plus loin
valeurs.append ...
moyenne.append ...

pas de problème

mais comme je doit à d'autres endroit du code réinitialiser ses listes,
je voulais faire une procédure du genre
def preparetableau():
valeurs = [
( unicode('Année','iso-8859-1'), 'Biens TF', 'Biens non
TF',
'Base brute', unicode('Somme à payer','iso-8859-1'),
unicode('Nb établissements','iso-8859-1') )
]
moyenne = [
( unicode('Année','iso-8859-1'),
'Biens TF\n entreprise', 'Biens TF\n ensemble',
'Biens non TF\n entreprise', 'Biens non TF\n ensemble',
'Base brute\n entreprise', 'Base brute\n ensemble',
unicode('Somme à payer\n entreprise','iso-8859-1'),
unicode('Somme à payer\n ensemble','iso-8859-1')
)
]

pour ensuite dans mes boucles, juste appeler
preparetableau()

et bien cela ne fonctionne pas, tout se passe comme si preparetableau()
n'était jamais appelé
merci


--
Philippe Makowski
Support et conseil pour Firebird : http://www.espelida.com
Firebird serveur SQL open-source en français http://firebird-fr.eu.org
Ma clé PGP : http://makowski.eu.org/pgpkey.html

9 réponses

Avatar
Pierre Quentel
Bonjour,

C'est le coup classique des variables locales et globales

Un petit exemple :

Python 2.5 (r25:51908, Sep 19 2006, 09:52:17) [MSC v.1310 32 bit
(Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
a = [0,1,2]
def reset():
... a = [5,6]



...
reset()
a
[0, 1, 2]



def reset():
... global a



... a = [5,6]
...
reset()
a
[5, 6]




Dans le premier cas, a est créé localement dans la fonction et
n'affecte pas la variable globale du même nom
Dans le deuxième cas on demande à la fonction d'utiliser le "a" défini
au niveau du module

Cordialement,
Pierre



Avatar
Philippe Makowski
Bonjour,

C'est le coup classique des variables locales et globales
merci, j'avais vu la notion de global, mais ne savais comment

l'utiliser

--
Philippe Makowski
Support et conseil pour Firebird : http://www.espelida.com
Firebird serveur SQL open-source en français http://firebird-fr.eu.org
Ma clé PGP : http://makowski.eu.org/pgpkey.html

Avatar
Jerome
Philippe Makowski wrote:
Bonjour,

C'est le coup classique des variables locales et globales
merci, j'avais vu la notion de global, mais ne savais comment l'utiliser





Bonjour,
il faut néanmoins garder à l'esprit que les variables globales
modifiées dans des fonctions sont un excellent moyen de produire du code
illisible avec des effets de bords non désirés.

Tu peux améliorer la lisibilité du code de plusieurs façons :

- modifier la signature de ta fonction pour passer les tableaux en
paramètres

def preparetableau(valeur, moyenne):
valeurs = [...]
moyenne = [...]

- renvoyer les tableaux à la fin de ta fonction

def preparetableau():
valeurs = [...]
moyenne = [...]
return (valeurs, moyenne)

(valeurs, moyenne) = preparetableau()

- avoir une approche objet

class Global:

def __init__(self):
self.initialize()

def initialize(self):
self.valeurs = [...]
self.moyenne = [...]

g = Global()
print g.valeurs


Avatar
bruno.desthuilliers
On 6 fév, 11:39, Jerome wrote:
Philippe Makowski wrote:
Bonjour,

C'est le coup classique des variables locales et globales
merci, j'avais vu la notion de global, mais ne savais comment l'utiliser



Bonjour,
il faut néanmoins garder à l'esprit que les variables globales
modifiées dans des fonctions sont un excellent moyen de produire du code
illisible avec des effets de bords non désirés.


DansMesBras(tm)

Tu peux améliorer la lisibilité du code de plusieurs façons :

- modifier la signature de ta fonction pour passer les tableaux en
paramètres

def preparetableau(valeur, moyenne):
valeurs = [...]
moyenne = [...]


Ne fonctionne pas en Python. Les noms 'valeur' et 'moyenne' sont
locaux à la fonction, donc les rebinder n'a d'effet que localement.



Avatar
Philippe Makowski
On 6 fév, 11:39, Jerome wrote:
Philippe Makowski wrote:
Bonjour,

C'est le coup classique des variables locales et globales
merci, j'avais vu la notion de global, mais ne savais comment l'utiliser



Bonjour,
il faut néanmoins garder à l'esprit que les variables globales
modifiées dans des fonctions sont un excellent moyen de produire du code
illisible avec des effets de bords non désirés.


DansMesBras(tm)

Tu peux améliorer la lisibilité du code de plusieurs façons :

- modifier la signature de ta fonction pour passer les tableaux en
paramètres

def preparetableau(valeur, moyenne):
valeurs = [...]
moyenne = [...]


Ne fonctionne pas en Python. Les noms 'valeur' et 'moyenne' sont
locaux à la fonction, donc les rebinder n'a d'effet que localement.


oui, je confirme, c'est la première chose que j'avais essayé de faire,
et sans succes
le global me va très bien dans mon cas

--
Philippe Makowski
Support et conseil pour Firebird : http://www.espelida.com
Firebird serveur SQL open-source en français http://firebird-fr.eu.org
Ma clé PGP : http://makowski.eu.org/pgpkey.html




Avatar
Laurent Pointal
On 6 fév, 11:39, Jerome wrote:
Philippe Makowski wrote:
Bonjour,
C'est le coup classique des variables locales et globales
merci, j'avais vu la notion de global, mais ne savais comment l'utiliser

Bonjour,

il faut néanmoins garder à l'esprit que les variables globales
modifiées dans des fonctions sont un excellent moyen de produire du code
illisible avec des effets de bords non désirés.


DansMesBras(tm)

Tu peux améliorer la lisibilité du code de plusieurs façons :

- modifier la signature de ta fonction pour passer les tableaux en
paramètres

def preparetableau(valeur, moyenne):
valeurs = [...]
moyenne = [...]


Ne fonctionne pas en Python. Les noms 'valeur' et 'moyenne' sont
locaux à la fonction, donc les rebinder n'a d'effet que localement.


Par contre, il peut *modifier* les objets listes existant (append,
remove..., modification par slice du genre valeurs[:] = [...]




Avatar
Jerome
Laurent Pointal wrote:
On 6 fév, 11:39, Jerome wrote:
Philippe Makowski wrote:
Bonjour,
C'est le coup classique des variables locales et globales
merci, j'avais vu la notion de global, mais ne savais comment l'utiliser

Bonjour,

il faut néanmoins garder à l'esprit que les variables globales
modifiées dans des fonctions sont un excellent moyen de produire du code
illisible avec des effets de bords non désirés.
DansMesBras(tm)


Tu peux améliorer la lisibilité du code de plusieurs façons :

- modifier la signature de ta fonction pour passer les tableaux en
paramètres

def preparetableau(valeur, moyenne):
valeurs = [...]
moyenne = [...]
Ne fonctionne pas en Python. Les noms 'valeur' et 'moyenne' sont

locaux à la fonction, donc les rebinder n'a d'effet que localement.


Par contre, il peut *modifier* les objets listes existant (append,
remove..., modification par slice du genre valeurs[:] = [...]



oui, c'est ce que je fais d'habitude, j'aurais du relire mon code...


J'en profite pour demander aux experts s'il existe un moyen en python de
réaliser cette "réaffectation de pointeurs", plus par curiosité du
langage que pas besoin d'ailleurs.





Avatar
Philippe Makowski
Par contre, il peut *modifier* les objets listes existant (append,
remove..., modification par slice du genre valeurs[:] = [...]


cool, c'est encore mieux comme ça
merci

--
Philippe Makowski
Support et conseil pour Firebird : http://www.espelida.com
Firebird serveur SQL open-source en français http://firebird-fr.eu.org
Ma clé PGP : http://makowski.eu.org/pgpkey.html

Avatar
Méta-MCI
Bonjour !

J'en profite pour demander aux experts s'il existe un moyen en python de
réaliser cette "réaffectation de pointeurs", plus par curiosité du langage
que pas besoin d'ailleurs.


J'chui pô expert (ou alors en apéro). Mais, tu peux toujours manipuler
globals(). Exemple :

a11
b"22
print a,b,id(a),id(b)
globals()['b']=globals()['a']
print a,b,id(a),id(b)



@-salutations

Michel Claveau