2016-12-02 4 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

BTW, если решение было полезным, пожалуйста, не забудьте принять его! :) – Raptor

Смежные вопросы