Не удается передать пустой список функции Python, выдает TypeError

Предполагается, что функция выводит все битовые вектора длиной n бит и содержат k единиц. Проблема в том, что я не могу дать пустой список на вход функции.

Я работаю над Ubuntu и использую Python 3.6. Я также пытался использовать непустой список, например [1], но это выдает ту же ошибку. При попытке найти длину пустого списка вне функции работает как надо: len([]) возвращает 0.

Вот мой код:

def bitvector(n, k, vektor):
    if len(vektor) == n:
        if vektor.count(1) == k:
            print(vektor)
    bitvector(n, k, vektor.append(0))
    bitvector(n, k, vektor.append(1))


bitvector(1, 2 , [])

РЕДАКТИРОВАТЬ:

def bitvector(n, k, vektor):
    if len(vektor) > n:
        return
    if len(vektor) == n:
        print("test")
        if vektor.count(1) == k:
            print(vektor)
            return
    bitvector(n, k, vektor.append(1))
    bitvector(n, k, vektor.append(0))


bitvector(1, 2 , [])

Он должен получить длину списка, но вместо этого выдает следующую ошибку:

TypeError: объект типа «NoneType» не имеет len()


person frarr    schedule 27.09.2019    source источник
comment
vektor is None - это не [], как вы ожидаете   -  person rdas    schedule 27.09.2019
comment
vektor.append возвращает None, а не обновленное значение list. Вместо этого передайте vecktor + [0] в качестве аргумента. (Или убедитесь, что ваша рекурсивная функция будет работать правильно, если вы измените аргумент.)   -  person chepner    schedule 27.09.2019
comment
Возможно, вы захотите сделать. vektor + [0] и vektor + [1].   -  person Poojan    schedule 27.09.2019
comment
Также, пожалуйста, опубликуйте полный код.   -  person Poojan    schedule 27.09.2019
comment
Если вы ожидаете, что vektor может быть list или None, вы можете протестировать if len(vektor or []): ..., чтобы вы всегда могли обрабатывать список   -  person Juraj Bezručka    schedule 27.09.2019
comment
Это полный код, ошибка отступа. Проблема в том, что вектор имеет значение None, а не [], как упоминалось в @rdas. Как я могу передать пустой список функции?   -  person frarr    schedule 27.09.2019
comment
chepner и Poojan показали вам, что делать.   -  person Daniel Roseman    schedule 27.09.2019
comment
Вы столкнетесь с бесконечной рекурсией, когда ваш TypeError будет разрешен. print не выходит return из функции   -  person C.Nivs    schedule 27.09.2019
comment
Даже если вы устраните проблему .append, ваш код будет работать вечно, ничего не печатая, потому что bitvector(1, 2 , []) вызовет bitvector(1, 2 , [0]), который вызовет bitvector(1, 2 , [0, 0]) и т. д., и за конечное время не будет добавлено ни одной единицы. (Вы не должны делать рекурсивные вызовы, если len(vektor)>=n, мне кажется.)   -  person Leporello    schedule 27.09.2019
comment
Ошибка исходит из первого предложения if. .append() не проблема. Кроме того, я пытаюсь исправить проблему TypeError, проблема бесконечной рекурсии теперь решена.   -  person frarr    schedule 27.09.2019
comment
Даже если я передам [1] в качестве входных данных для функции битвектора (bitvector(1, 2, [1]), она все равно вернет ту же ошибку: TypeError: объект типа 'NoneType' не имеет len().   -  person frarr    schedule 27.09.2019
comment
Не уверен, почему вы не хотите слушать всех, кто здесь объясняет. vektor.append() - это проблема. append всегда возвращает None, поэтому, когда вы вызываете bitvector(n, k, vektor.append(1)), вы фактически вызываете bitvector(n, k, None). Следовательно, проблема, о которой вы сообщили, NoneType не имеет len()   -  person micric    schedule 27.09.2019
comment
Я пытался использовать разные способы добавления списка, а также пробовал упомянутые выше, и ни один из них не работал. Выяснил, что я могу передать функцию [0,0] в качестве аргумента, и она может работать с этим. Так и не могу найти где ошибка.   -  person frarr    schedule 27.09.2019
comment
Конечно, потому что в этом случае вы возвращаетесь из функции и никогда не переходите к битвектору (n, k, vektor.append (1))   -  person micric    schedule 27.09.2019
comment
Да, должен признать, это была глупая идея. Нашел решение. Вместо списка я использовал строку.   -  person frarr    schedule 27.09.2019


Ответы (1)


Поскольку я не был ограничен в использовании определенного типа, я решил использовать строку вместо списка.

def bitvector(n, k, vektor):
    vektor_list = list(vektor)
    if len(vektor) > n:
        return
    if len(vektor) == n:
        if vektor_list.count("1") == k:
            print(vektor)
            return
    bitvector(n, k, vektor + "0")
    bitvector(n, k, vektor + "1")

РЕДАКТИРОВАТЬ, оптимизировал мой код:

def bitvector(n, k, vektor):
vektor_list = list(vektor)
if vektor_list.count("1") > k:
    return
if len(vektor) == n:
    if vektor_list.count("1") == k:
        print(vektor)
        return
    else:
        return
bitvector(n, k, vektor + "0")
bitvector(n, k, vektor + "1")
person frarr    schedule 27.09.2019