IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

importer des variables - Chimie


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2009
    Messages : 51
    Points : 37
    Points
    37
    Par défaut importer des variables - Chimie
    bonjour j'ai crée un script qui extrait des données d'un fichier texte (Za, X, Y, Z)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    def readXYZ(chaine, nbre_confo):
      k = 0 
      for i, line in enumerate(lines):
     
        j = 5
        if (chaine in line) and (nbre_confo > k):
          k = k + 1
          Za = []
          X = []
          Y = []
          Z = []
          while j<14 :
    	Za.append( (float( (lines[i + j].split())[1]) ))
    	X.append( ( float( (lines[i + j].split())[3]) ))
    	Y.append( ( float( (lines[i + j].split())[4]) ))
    	Z.append( ( float( (lines[i + j].split())[5]) ))
    	j = j + 1
          print(X)
     
    def energy(nbre_confo):      
      readXYZ(chaine, nbre_confo)
      E = 0
      for i in range(len(Za)):
        for j in range(i+1,len(Za)):
          distance =  (sqrt(pow((X[i] - X[j]),2) + pow((Y[i] - Y[j]),2) + pow((Z[i] - Z[j]),2)))  / 0.5291772085936 
          E = E + ( (Za[i] * Za[j]) / distance )
        print(E)
    le probleme c'est que qu'on j'appel la methode energy(nbre_confo) il me sort l'erreur que "Za" n'est pas defini alors que j'ai pris la peine d'appeler l'execution de la methode readXYZ dans la methode energy().

    Comment je dois faire pour importer les variables de cette methode ???

    Merci pour votre aide

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    def readXYZ(chaine, nbre_confo):
      k = 0 
      for i, line in enumerate(lines):
     
        j = 5
        if (chaine in line) and (nbre_confo > k):
          k = k + 1
          Za = []
          X = []
          Y = []
          Z = []
          while j<14 :
    	Za.append( (float( (lines[i + j].split())[1]) ))
    	X.append( ( float( (lines[i + j].split())[3]) ))
    	Y.append( ( float( (lines[i + j].split())[4]) ))
    	Z.append( ( float( (lines[i + j].split())[5]) ))
    	j = j + 1
          print(X)
        return Za, X, Y, Z
     
    def energy(nbre_confo):      
      Za, X, Y, Z = readXYZ(chaine, nbre_confo)
      E = 0
      for i in range(len(Za)):
        for j in range(i+1,len(Za)):
          distance =  (sqrt(pow((X[i] - X[j]),2) + pow((Y[i] - Y[j]),2) + pow((Z[i] - Z[j]),2)))  / 0.5291772085936 
          E = E + ( (Za[i] * Za[j]) / distance )
        print(E)
    @+
    Merci d'utiliser le forum pour les questions techniques.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Hum, neeoo11, tu aurais pu continuer sur l'autre discussion plutôt que d'en créer une nouvelle...

    La variable chaine dans la fonction energy, elle sort d'où ?

    En comparant ce code avec celui de l'autre discussion (http://www.developpez.net/forums/d10...chimie-python/), les deux codes ne font pas la même chose ! Ici on dirait que tu recherches une valeur globale de energy; dans l'autre discussion tu semblais vouloir calculer energy pour chaque bloc du fichier dont le début était marqué par chaine.

    Dans le code de PauseKawa, le return est à l'intérieur du if dans ReadXYZ, donc tu ne calcules energy que pour le premier bloc dans le fichier. N'y en a-t-il qu'un seul ?

    Sans en savoir plus sur le problème, je ne peux que me baser que sur ton code pour savoir ce que tu veux, et ce n'est pas très clair.

  4. #4
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    @dividee: Pas vraiment au niveau du if en fait. C'est un copier/coller sur le forum et l'indentation de neeoo11 m'as 'fais buger' comme disent les jeunes. D'où l'utilité de la prévisualisation sur le forum...

    @neeoo11: Dans les deux sujets je ne vois en fait qu'une incompréhension de la porté des variables. A comprendre qu'une variable définie dans une fonction n'est visible que dans celle ci.

    Pour (tenter) d'expliquer la porté des variables

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/usr/bin/env python
    # _*_ coding: utf-8 _*_
    #
    #
    def readXYZ(unevariable):
        print('unevariable passée en argument', unevariable)
        Za = unevariable * 2
        print('Za définie dans readXYZ', Za)
     
     
    def energy():
        unevariable = 1
        print('unevariable dans energy', unevariable)
        readXYZ(unevariable)
        print Za
     
    energy()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ('unevariable dans energy', 1)
    ('unevariable pass\xc3\xa9e en argument', 1)
    ('Za d\xc3\xa9finie dans readXYZ', 2)
    Traceback (most recent call last):
      File "neeoo11.py", line 17, in <module>
        energy()
      File "neeoo11.py", line 15, in energy
        print Za
    NameError: global name 'Za' is not defined
    Ici Za est une variable locale de readXYZ et energy ne la vois pas.
    En fait energy ne vois que ses variables locales ou de 'niveau supérieur dans le code'.

    C'est les espaces de noms (Namespaces). Un espace de noms est semblable a un dictionnaire (Spécial toutefois) dans lequel les clés sont les noms des variables et les valeurs du dictionnaire sont les valeurs des variables.
    Une fonction a son propre espace de noms local. On y retrouve les variables de la fonction, arguments compris (Voir def readXYZ(unevariable)).
    Elle vois aussi les variable 'de niveau supérieur' (comprendre supérieur au bloc de code). C'est l'espace de nom global.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Za = 1
    def energy():
        print Za
     
    energy()
    Lorsque le nom d'une variable est donné Python la recherche en premier dans l'espace de nom local, puis dans le global, puis dans un dernier Espace prédéfini (global à tout), pour finalement regarder si ce n'est pas une fonction du langage.

    Quiz : C'est bien beau tout cela mais maintenant que j'ai ma variable 'enfermée' dans ma fonction je fais quoi ?

    Il existe bien des manières de procéder. Je n'en citerais que deux pour le moment.

    La première est de déplacer la variable dans l'espace de nom global.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #!/usr/bin/env python
    # _*_ coding: utf-8 _*_
    #
    #
    def readXYZ(unevariable):
        print('unevariable passée en argument', unevariable)
        global Za # <--------------------------------------- ici
        Za = unevariable * 2
        print('Za définie dans readXYZ', Za)
     
     
    def energy():
        unevariable = 1
        print('unevariable dans energy', unevariable)
        readXYZ(unevariable)
        print ("Za vue dans le global d'energy", Za)
     
    energy()
    Ici global place Za dans l'espace de nom global de readXYZ. Comme les fonctions readXYZ et energy sont au même niveau c'est aussi celui d'energy.
    La limite en est que les fonctions doivent êtres de même niveau donc.

    La seconde par du fait qu'une fonction retourne toujours quelque chose.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def test():
        print('Je suis dans test')
     
     
    def test1():
        print('Je suis dans test1')
        return 1
     
    a = test()
    print (a)
     
    b = test1()
    print (b)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Je suis dans test
    None
    Je suis dans test1
    1
    Soit avec ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def readXYZ():
        Za = 1
        return Za
     
     
    def energy():
        Za = readXYZ()
        print ("Za dans energy", Za)
     
    energy()
    A noter que return arrête l'exécution de la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def readXYZ():
        Za = 1
        return Za
        print ('Za dans readXYZ', Za) # <------------ N'est pas lu
     
     
    def energy():
        Za = readXYZ()
        print ("Za dans energy", Za)
     
    energy()
    C'est sans doute la meilleure façon de procéder car on est sur de l'origine de la variable.

    (Note : Si vous êtes arriver jusqu'ici c'est que vous n'avez rien a faire de la journée.)

    Autre chose (comme le précise dividee avec la variable chaine) dans ton code:
    On y vois des variables non définis. Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def readXYZ(chaine, nbre_confo):
        k = 0 
        for i, line in enumerate(lines):
    D'où viens lines ?

    Ensuite:
    Le remplissage des listes (Za, X, Y, Z) est conditionné par le if (chaine in line) and (nbre_confo > k):. Tu dois prendre cela en compte dans energy.

    Pour finir sur une généralité:
    En python l'indentation est de quatre espaces (voir mon code).

    Je pense que c'est tout pour le moment.

    Bon code
    Merci d'utiliser le forum pour les questions techniques.

Discussions similaires

  1. [bash] Peut on importer des variables avec While IFS?
    Par percherie dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 25/01/2010, 12h40
  2. Importer des plages de cellules variables
    Par charles_bois dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/01/2009, 19h13
  3. Réponses: 0
    Dernier message: 08/07/2008, 11h11
  4. Réponses: 7
    Dernier message: 23/01/2006, 11h53
  5. Importer via asp.net c# des variables dans mon namespace xsl
    Par akaii dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 23/01/2006, 08h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo