从函数返回值失败,返回 NoneType
Returning a value from a function failed with NoneType
我在从外部函数返回值时遇到问题。
函数:
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)
主要功能:
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")
打印函数中的值weg_pfad
给我一个值:['P5', 'P3']
。
在 main 函数中打印值给我 None
.
为什么会这样,我该如何解决?
下一步是返回多个值 -> weg_pfad
和 entfernungen[zielpunkt]
。
您多次调用 dijkstra 函数。因此,虽然当您最终找到解决方案时它 return 具有一定的价值,但所有进入“else”子句的中间调用都将在没有任何 return 语句的情况下结束,因此 returning 默认为 None.
您需要通过使用 return
和函数的递归调用将最终值一直传递到调用链的顶部。
我在从外部函数返回值时遇到问题。
函数:
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)
主要功能:
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")
打印函数中的值weg_pfad
给我一个值:['P5', 'P3']
。
在 main 函数中打印值给我 None
.
为什么会这样,我该如何解决?
下一步是返回多个值 -> weg_pfad
和 entfernungen[zielpunkt]
。
您多次调用 dijkstra 函数。因此,虽然当您最终找到解决方案时它 return 具有一定的价值,但所有进入“else”子句的中间调用都将在没有任何 return 语句的情况下结束,因此 returning 默认为 None.
您需要通过使用 return
和函数的递归调用将最终值一直传递到调用链的顶部。