web-dev-qa-db-fra.com

Liste de retour Python de la fonction

J'ai une fonction qui analyse un fichier dans une liste. J'essaie de renvoyer 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 ne fais pas correctement ou existe-t-il un meilleur moyen de passer des variables entre des fonctions sans utiliser de globals?

30
Thomas Mitchell

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
43
Alex Coplan

Je suppose que vous n'affectez pas la valeur renvoyée à une variable de portée.

c'est à dire. tu ne peux pas faire

splitNet()
print network

vous le feriez plutôt

network = splitNet()
print network

ou d'ailleurs

my_returned_network_in_scope = splitNet()
print my_returned_network_in_scope

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

14
sberry

Les noms des variables dans une fonction ne sont pas visibles à l'extérieur. Vous devez donc appeler votre fonction comme suit:

networks = splitNet()
print(networks)

Quelques autres notes:

  • Vous voudrez peut-être convertir votre fonction en itérateur, en utilisant yield .
  • Vous n'avez pas besoin d'appeler readlines; la fonction elle-même est un itérateur.
  • Votre fonction a peut-être une fuite du descripteur de fichier. Utilisez l'instruction with.
  • Vous pouvez utiliser str.split, qui est plus lisible et plus facile à comprendre que string.split.
  • Votre fichier semble être un fichier CSV. Utilisez le module csv .

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

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)
6
phihag

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

network = splitNet()
print network

Par exemple

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

Avez-vous déjà appelé la fonction? Cela 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]
2
Chris Taylor

Si vous souhaitez renvoyer un élément ou une liste à partir d'une définition, vous pouvez le définir à l'avance et l'utiliser comme variable lors de l'écriture initiale de cette définition. Sauf si cela doit être défini dans la définition. Dans ce cas, vous n'aurez pas besoin d'écrire dans une commande de retour à la fin.

network = []

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)

print network # Will print the list you've appended. But it is now a usable object. 
0
Lord Pantaloon

Vous pouvez déclarer le nom de la variable assignée à la liste en tant que global, comme ceci:

def get_list():
    global destination_list
    destination_list = []
    destination_list.extend(('1','2','3'))
    return destination_list

get_list()
print(destination_list)
0
Victor