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() без какой-либо функции, он возвращает последовательность без изменений.






Я удалил * в вашей 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)
Да, он выдаст эту ошибку и причину, потому что в вашей функции filter1 у вас есть параметр или, другими словами, argument, который вам нужно указать. Как вы сказали здесь в своем коде print(s1['filter']()), вы ничего не предоставляете, () пусто, поэтому вам нужно указать там функцию, поскольку параметр, как я вижу, вы собираетесь поместить его в функцию filter.
я понимаю, почему я получаю сообщение об ошибке, но миссия, которую мне нужно выполнить, такова: когда я вызываю клавишу «фильтр», мне нужно отправить функцию, чтобы отфильтровать мою последовательность или не отправлять отметку на фильтр1, и это не изменит мою последовательность
Вам нужно сделать что? есть *? object is not callable означает, что tuple не вызывается, поэтому это не функция.
например: s1 = make_seq((1,2,3,4,5)), >>> s1['фильтр'](лямбда x: x>2) >>>(3,4,5) >>> s1['фильтр']() >>>(1,2,3,4,5)
да, я знаю, что без * это будет работать, но когда я попытаюсь выполнить print(s1['filter']()) он скажет, что filter1() отсутствует 1 обязательный позиционный аргумент: 'func'