webentwicklung-frage-antwort-db.com.de

Python-Rückkehrliste von der Funktion

Ich habe eine Funktion, die eine Datei in eine Liste parst. Ich versuche, diese Liste zurückzugeben, damit ich sie in anderen Funktionen verwenden kann. 

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

Wenn ich versuche, die Liste außerhalb der Funktion (zum Debuggen) zu drucken, erhalte ich diese Fehlermeldung:

NameError: name 'network' is not defined

Gibt es etwas einfaches, was ich falsch mache, oder gibt es eine bessere Möglichkeit, Variablen zwischen Funktionen zu übergeben, ohne Globals zu verwenden?

30
Thomas Mitchell

Auf Variablen kann nicht außerhalb des Bereichs einer Funktion zugegriffen werden, in der sie definiert wurden.

Einfach das tun:

network = splitNet()
print network
43
Alex Coplan

Ich gehe davon aus, dass Sie den zurückgegebenen Wert keiner Variablen im Gültigkeitsbereich zuweisen.

dh. du kannst es nicht tun

splitNet()
print network

stattdessen würdest du

network = splitNet()
print network

oder für diese Angelegenheit

my_returned_network_in_scope = splitNet()
print my_returned_network_in_scope

andernfalls könnten Sie das Netzwerk außerhalb der Funktion splitNet deklarieren und global machen. Dies ist jedoch nicht die empfohlene Vorgehensweise.

14
sberry

Die Namen von Variablen in einer Funktion sind außerhalb nicht sichtbar. Daher müssen Sie Ihre Funktion folgendermaßen aufrufen:

networks = splitNet()
print(networks)

Ein paar andere Hinweise:

  • Sie können Ihre Funktion mithilfe von yield in einen Iterator konvertieren.
  • Sie müssen nicht readlines aufrufen. Die Funktion selbst ist ein Iterator.
  • Ihre Funktion verliert möglicherweise den Datei-Handle. Verwenden Sie die Anweisung with.
  • Sie können str.split verwenden, das besser lesbar und verständlicher ist als string.split.
  • Ihre Datei scheint eine CSV-Datei zu sein. Verwenden Sie das Modul csv .

Zusammenfassend sollte Ihr Code so aussehen:

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

Ihre Funktion gibt eine Liste zurück, also müssen Sie sie einer Variablen zuweisen und dann versuchen, sie zu drucken.

network = splitNet()
print network

Zum Beispiel

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

Hast du die Funktion eigentlich schon angerufen? Das funktioniert gut (im Python-Interpreter)

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

def rl(l): 
    return l

[*ll] = rl(L) # ll is in a list

ll
# >>> [1, 2, 3]

*t, = rl(L)   # ll is in a Tuple

t
# >>> [1, 2, 3]
L=[1,2,3]
def rl(l): return l

[*ll]=rl(L) #ll is in a list
ll

Out [45]: [1, 2, 3]

*t,=rl(L) #ll is in a Tuple
t

Out [47]: [1, 2, 3]

Wenn Sie ein Element oder eine Liste aus einer Definition zurückgeben möchten, können Sie diese zuvor definieren und beim ersten Schreiben der Definition als Variable verwenden. Es sei denn, es muss innerhalb der Definition definiert werden. In diesem Fall müssen Sie am Ende keinen Rückkehrbefehl eingeben.

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

Sie können den Namen der der Liste zugewiesenen Variablen wie folgt als global angeben:

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

get_list()
print(destination_list)
0
Victor