【问题标题】:Returning a value from a function failed with NoneType [duplicate]从函数返回值失败,NoneType [重复]
【发布时间】:2022-01-12 09:18:08
【问题描述】:

我在从外部函数返回值时遇到问题。

功能:

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']。 在主函数中打印值给我None

为什么会这样,我该如何解决?

下一步是返回多个值 -> weg_pfadentfernungen[zielpunkt]

【问题讨论】:

  • 我认为您必须在 else 块中添加一个返回值。所以返回 dijkstra(netzwerk,nd,zielpunkt,punkt_geprueft,entfernungen,vorgaenger)
  • 99% 确定您在递归调用函数时丢失了 return
  • 如果采用else : 分支,则没有return 语句,因此该函数有效地返回None。通过函数的所有路径都必须返回一些东西。

标签: python printing return return-value dijkstra


【解决方案1】:

您多次调用 dijkstra 函数。因此,当您最终找到解决方案时它会返回一些值,但所有进入“else”子句的中间调用都将在没有任何返回语句的情况下结束,因此返回默认值 None。

您需要使用 return 和函数的递归调用,将最终值一直传递到调用链的顶部。

【讨论】:

    猜你喜欢
    • 2018-06-10
    • 2015-05-25
    • 2021-07-02
    • 1970-01-01
    • 2020-08-26
    • 2011-04-18
    • 2011-04-19
    相关资源
    最近更新 更多