Объект 'tuple' не вызывается в моем коде

def make_sequence(seq):
    def filter1(*func):
        new_filter = filter(func, seq)
        return tuple(new_filter)

    def filter_iterator(*func):
        new_seq = tuple(filter(func, seq))
        index = 0

        def next1():
            nonlocal index
            if index >= 0 and index < len(new_seq):
                ele = new_seq[index]
                index += 1
            else:
                index = 0
                ele = new_seq[index]
                index += 1
            return ele

        def reverse():
            nonlocal index
            index -= 1
            if index >= 0 and index < len(new_seq):
                ele = new_seq[index]
            else:
                index = len(new_seq) - 1
                ele = new_seq[index]
            return ele

        return {'next': next1, 'reverse': reverse}

    def reverse():
        return tuple(seq[::-1])

    def extend(new_seq):
        nonlocal seq
        seq += new_seq

    return {'filter': filter1, 'filter_iterator': filter_iterator, 'reverse': reverse, 'extend': extend}


s1 = make_sequence((1, 2, 3, 4, 5))
print(s1['filter'](lambda x: x % 2 == 0))

Когда я пытаюсь вернуть кортеж из fitlter1, я получаю сообщение об ошибке:

Объект 'tuple' не вызывается.

Что я пытаюсь сделать, так это filter1 получить аргумент *args, потому что, когда я буду вызывать filliter1() без какой-либо функции, он возвращает последовательность без изменений.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
300
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я удалил * в вашей def filter1(func): попытке, я заметил, что ваш параметр представляет собой *func с *, где на самом деле это кортеж, когда вы вводите некоторые аргументы в функцию. Кажется, что вам не нужно *. Я думаю, вам нужно искать о *args и **kwargs

Я запустил его и получил этот вывод

(2, 4)
[Finished in 0.3s]

Вот быстрый пример, почему вы получили это сообщение. Потому что, когда вы добавляете * к параметру функции, ее тип данных — tuple.

def foo(*args):
    print(args)
    print(type(args))


foo(1)

Выход:

(1,)
<class 'tuple'>

Почему вы получаете ошибку?

filter(func, seq)

Функция filter ожидает, что ваша func является функцией или, по крайней мере, лямбдой, но на самом деле это не tuple, как только вы поместите * на свой def filter1(*func).


Так что основывайтесь на том, что вы сказали здесь.

Я пытаюсь сделать так, чтобы filter1 получил аргумент *args, потому что, когда я вызовет filitter1() без какой-либо функции, он вернет последовательность без изменений.

Что вы можете сделать с вашей функцией

def filter1(func=None):
    if callable(func):
        new_filter = filter(func, seq)
        return tuple(new_filter)

    return seq

Измените свою функцию filter1 на это, и вы получите это.

print(s1['filter'](lambda x: x % 2 == 0))
print(s1['filter']())
print(s1['filter'](lambda x: x>2))

Выход:

(2, 4)
(1, 2, 3, 4, 5)
(3, 4, 5)

да, я знаю, что без * это будет работать, но когда я попытаюсь выполнить print(s1['filter']()) он скажет, что filter1() отсутствует 1 обязательный позиционный аргумент: 'func'

Roni Jack Vituli 19.12.2020 12:29

Да, он выдаст эту ошибку и причину, потому что в вашей функции filter1 у вас есть параметр или, другими словами, argument, который вам нужно указать. Как вы сказали здесь в своем коде print(s1['filter']()), вы ничего не предоставляете, () пусто, поэтому вам нужно указать там функцию, поскольку параметр, как я вижу, вы собираетесь поместить его в функцию filter.

Ice Bear 19.12.2020 12:35

я понимаю, почему я получаю сообщение об ошибке, но миссия, которую мне нужно выполнить, такова: когда я вызываю клавишу «фильтр», мне нужно отправить функцию, чтобы отфильтровать мою последовательность или не отправлять отметку на фильтр1, и это не изменит мою последовательность

Roni Jack Vituli 19.12.2020 12:40

Вам нужно сделать что? есть *? object is not callable означает, что tuple не вызывается, поэтому это не функция.

Ice Bear 19.12.2020 12:42

например: s1 = make_seq((1,2,3,4,5)), >>> s1['фильтр'](лямбда x: x>2) >>>(3,4,5) >>> s1['фильтр']() >>>(1,2,3,4,5)

Roni Jack Vituli 19.12.2020 12:45

Другие вопросы по теме