为什么显示对象引用而不是值

问题描述:

我确定这是一个简单的语法问题,但我无法弄清楚为什么我的生成器正在返回一个引用而不是预期的值。为什么显示对象引用而不是值

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] 

以下是你的代码的小修改后的版本,但读取更清洁和更容易理解:

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