0

ここに私が書いた関数があります:

def conc(i,s,y):
    if sheet.cell(i+1,0).value != sheet.cell(2,0).value :
        # print s
        rtrns = s
        # print rtrns
        return rtrns

    else:
        if i==list1[len(list1)-1]:
            while i<(sheet.nrows):
                # print i
                s = s + " " + unicode(sheet.cell(i,y).value).encode('cp1252', 'replace')
                i+=1
            # print s
            rtrns = s
            # print rtrns
            return rtrns
        else:
            s = s + " " + unicode(sheet.cell(i+1,y).value).encode('cp1252', 'replace')
            #return s
            conc(i+1,s,y)

上記の関数では、最初の if ブロックで rtrns の値を出力すると、必要な値が表示されます。

しかし、関数を呼び出すと

c = conc(x,c,2)     #where x fetches an integer value as an index from a list
print c

戻りますNone

4

1 に答える 1

4

コードのreturnelse部分にステートメントがありません

else:
    s = s + " " + unicode(sheet.cell(i+1,y).value).encode('cp1252', 'replace')
    #return s
    conc(i+1,s,y)

したがって、再帰関数から何も返されないコード パスが 1 つありますconc

コードを変更してリターンを追加

else:
    s = s + " " + unicode(sheet.cell(i+1,y).value).encode('cp1252', 'replace')
    #return s
    return conc(i+1,s,y)

再帰呼び出しは常に呼び出し元に戻ります。したがって、 を再帰的に呼び出しconc、コード パスの 1 つが return ステートメントを発行すると、呼び出しは呼び出した場所に戻ります。もう 1 つの重要なことは、明示的な return のない関数には、 None を持つ暗黙の return があるということです。

次の ASCII アートは、何がうまくいかないのかを自明にする必要があります。

foo() <------------------------------------------------------------------------
    |                                                                          |
    |                                                                          |
    |->def conc(...):                                                          |
           else:                                                             (None)
           .........                                                           |
              conc(i+1,s,y) <-------------------------------------------\      |
              return None  ----------------------------------------------U--- -|
               |                                                         |
               |                                                         | 
               \----->def conc(...):                                     |
                          else:                                        (None)
                          .........                                      |
                                conc(i+1,s,y) <----------------------\   |
                                return None   ------------------------U--|
                                |                                     |
                                |                                     |
                                |                                     |
                                \----------->def conc(...):        (rtrns)
                                                  if ... :            |
                                                  ..........          |
                                                      return rtrns----|
于 2013-10-11T08:53:16.480 に答える