2016-12-02 64 views
0

我確定這是一個簡單的語法問題,但我無法弄清楚爲什麼我的生成器正在返回一個引用而不是預期的值。爲什麼顯示對象引用而不是值

def flatten(val): 
    print('--------', val, '----------') 
    o = [] 
    for thing in val: 
    # print(thing, type(thing)) 
    if isinstance(thing, int): 
     o.append(thing) 

    if isinstance(thing, list): 
     o.append(i for i in thing if isinstance(i, int)) 

print(o) 
return o 

if __name__ == '__main__': 
    # flatten([0, 1, 2]) 
    flatten([0, [1], 2]) 

prints: 
[0, <generator object flatten.<locals>.<genexpr> at 0x7fe1d113b150>, 2] 

回答

1

以下是你的代碼的小修改後的版本,但讀取更清潔和更容易理解:

def flatten(val): 
    print('--------', val, '----------') 
    o = [] 

    for thing in val: 
     print(thing, type(thing)) 

     if isinstance(thing, int): 
      o.append(thing) 

     if isinstance(thing, list): 
      for a_thing in thing: 
       if isinstance(a_thing, int): 
        o.append(a_thing) 

    return o 

if __name__ == '__main__': 
    result = flatten([0, [1], 2]) 
    print result 

[0,1,2]

一些建議: 儘管此腳本可能適合進行實驗,但您最終可能需要recursion解決這些問題。遞歸函數是一種自我調用來完成工作的函數。一個問題是:如果你的輸入數組包含[0,[1,2,3],[4]]會怎麼樣?在這種情況下,你將需要一個嵌套循環來解決問題。當您的輸入如下所示時,問題變得更加複雜:[0,[1,2,[3,4]],[5]]。在這種情況下,使用遞歸函數。

這裏是一個遞歸函數可以如何解決該問題:

def flatten(*args): 
    number_list = [] 
    for item in args: 
     if isinstance(item, int): 
      number_list.append(item) 
     else: 
      number_list += flatten(*item) 

    return number_list 

if __name__ == '__main__': 
    print flatten([0, [1, 2, [3, 4, 5]], 6]) 

[0,1,2,3,4,5,6]

+0

這是exercism之一.io練習,我認爲遞歸是本課的重點。 – Eman

+0

順便說一句,如果解決方案有幫助,那麼請不要忘記接受它! :) – Raptor

相關問題