53 votes

Liste de retour de la fonction Python

J'ai une fonction qui analyse un fichier en une liste. J'essaie de retourner cette liste pour pouvoir l'utiliser dans d'autres fonctions.

def splitNet():
    network = []
    for line in open("/home/tom/Dropbox/CN/Python/CW2/network.txt","r").readlines():
        line = line.replace("\r\n", "")
        line = string.split(line, ',')
        line = map(int, line)
        network.append(line)
    return network

Lorsque j'essaie d'imprimer la liste en dehors de la fonction (pour le débogage), j'obtiens cette erreur :

NameError: name 'network' is not defined

Y a-t-il quelque chose de simple que je fais mal ou existe-t-il un meilleur moyen de faire passer des variables entre les fonctions sans utiliser les globaux ?

64voto

Alex Coplan Points 6450

Les variables ne sont pas accessibles en dehors de la portée d'une fonction dans laquelle elles ont été définies.

Faites simplement ceci :

network = splitNet()
print network

18voto

sberry Points 28742

Je suppose que vous n'assignez pas la valeur retournée à une variable dans la portée.

c'est-à-dire que vous ne pouvez pas faire

splitNet()
print network

Au lieu de cela, vous devez

network = splitNet()
print network

ou pour cette question

my_returned_network_in_scope = splitNet()
print my_returned_network_in_scope

Sinon, vous pourriez déclarer le réseau en dehors de la fonction splitNet, et le rendre global, mais ce n'est pas l'approche recommandée.

8voto

phihag Points 89765

Les noms des variables dans une fonction ne sont pas visibles à l'extérieur, vous devez donc appeler votre fonction comme ceci :

networks = splitNet()
print(networks)

Quelques autres remarques :

  • Vous voudrez peut-être convertir votre fonction en itérateur, en utilisant rendement .
  • Vous n'avez pas besoin d'appeler readlines ; la fonction elle-même est un itérateur.
  • Il se peut que votre fonction fasse fuir l'identifiant du fichier. Utilisez la fonction with déclaration.
  • Vous pouvez utiliser str.split ce qui est plus lisible et plus facile à comprendre que string.split .
  • Votre fichier semble être un fichier CSV. Utilisez l'option csv module .

En résumé, voici à quoi devrait ressembler votre code :

import csv
def splitNet():
    with open("/home/tom/Dropbox/CN/Python/CW2/network.txt") as nf:
        for line in csv.reader(nf, delimiter=','):
            yield map(int, line)
network = list(splitNet())
print (network)

5voto

RanRag Points 9395

Votre fonction renvoie une liste, vous devez donc l'affecter à une variable puis essayer de l'imprimer.

network = splitNet()
print network

Par exemple

>>> def mylist():
...    myl = []
...    myl.append('1')
...    return myl
...
>>> my_list = mylist()
>>> my_list
['1']
>>>

2voto

Chris Taylor Points 25079

Avez-vous déjà appelé la fonction ? Ceci fonctionne bien (dans l'interpréteur Python)

 >>> def f():
 ...   network = []
 ...   network.append(1)
 ...   network.append(2)
 ...   network.append(3)
 ...   return network
 ...
 >>> network = f()
 >>> print network
 [1, 2, 3]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X