I have a problem with returning a value from an external function.
Function:
def dijkstra(netzwerk,startpunkt,zielpunkt,punkt_geprueft=[],entfernungen={},vorgaenger={}):
if startpunkt not in netzwerk:
raise TypeError('Start- und/oder Zielpunkt nicht vorhanden')
if zielpunkt not in netzwerk:
raise TypeError('Zielpunkt kann nicht gefunden werden')
if startpunkt == zielpunkt:
weg_pfad=[]
variable_fuer_vorgaenger=zielpunkt
while variable_fuer_vorgaenger != None:
weg_pfad.append(variable_fuer_vorgaenger)
variable_fuer_vorgaenger=vorgaenger.get(variable_fuer_vorgaenger,None)
return weg_pfad
#print(weg_pfad)
else :
if not punkt_geprueft:
entfernungen[startpunkt]=0
for nachbarpunkt in netzwerk[startpunkt] :
if nachbarpunkt not in punkt_geprueft:
neue_entfernung = entfernungen[startpunkt] + netzwerk[startpunkt][nachbarpunkt]
if neue_entfernung < entfernungen.get(nachbarpunkt,float('inf')):
entfernungen[nachbarpunkt] = neue_entfernung
vorgaenger[nachbarpunkt] = startpunkt
punkt_geprueft.append(startpunkt)
ungeprueft={}
for k in netzwerk:
if k not in punkt_geprueft:
ungeprueft[k] = entfernungen.get(k,float('inf'))
nd= min(ungeprueft, key=ungeprueft.get)
dijkstra(netzwerk,nd,zielpunkt,punkt_geprueft,entfernungen,vorgaenger)
Main function:
startpunkt = self.dlg.DStart.text()
zielpunkt = self.dlg.DEnd.text()
weg_pfad = dijkstra(netzwerk, startpunkt, zielpunkt)
print(weg_pfad)
self.dlg.OutputText.append(weg_pfad)
self.dlg.OutputText.append("Ergebnis für Dijkstra Algorithmus")
Printing the value weg_pfad
in the function gives me a value: ['P5', 'P3']
.
Printing the value in the main function gives me None
.
Why is this and how can I fix it?
The next step is returning multiple values -> weg_pfad
and entfernungen[zielpunkt]
.
You call your dijkstra function multiple times. So while it returns some value when you finally find the solution, all the intermediary calls that entered the "else" clause will end without any return statement, thus returning default of None.
You need to pass your final value all the way up to the top of the calling chain by using return
with the recursive call of your function.