Как, не изменяя методы и их вызов, исправить ошибку?

как не изменяя методы и их вызов исправить ошибку?
# -*- coding: utf-8 -*-
#-------------multifilter-------------------
class multifilter:
    def judge_half(pos, neg):
        pass
        # допускает элемент, если его допускает хотя бы половина фукнций (pos >= neg)
 
    def judge_any(pos, neg):
        for el in pos:
            yield el        
        # допускает элемент, если его допускает хотя бы одна функция (pos >= 1)
 
    def judge_all(pos, neg):
        pass
        # допускает элемент, если его допускают все функции (neg == 0)
 
    def __init__(self, iterable, *funcs, judge = judge_any):
        self.iterable = iterable
        self.funcs = funcs
        result = []
        for i in self.funcs:
            for j in self.iterable:
                if i(j) == True:
                    result.append(j)
                judge(result, i)
            result = []
            
                    
def mul2(x):
    return x % 2 == 0
 
def mul3(x):
    return x % 3 == 0
 
def mul5(x):
    return x % 5 == 0
 
 
a = [i for i in range(31)] # [0, 1, 2, ... , 30]
 
print(list(multifilter(a, mul2, mul3, mul5)))
14 ответов

А что тут должно быть? Ты создал объект класса multifilter и пытаешься его превратить в list, естественно, вылазит ошибка.


https://stepik.org/lesson/24464/step/4Это предусмотренно задачей


Чтобы на объект можно было напустить list, он должен быть итерабельным, то есть нужен метод __iter__(self), возвращающий некоторый итератор (например, self, если сам объект и есть итератор)На степике есть метод __iter__, а в коде нет


Дело в том что с этим методом ошибка выдается


Ну так его как раз написать надо


Как допустимо передать данные в метод итер?


Не очень понятен смысл класса, но сделать можно так
def __iter__(self):
        for func in self.funcs:
            yield func


Я думаю, функции judge_* тоже нужно переписывать.


как не изменяя методы и их вызов исправить ошибку?
Ошибка: 'multifilter' object is not iterable Решение: сделать 'multifilter' iterableКак-то так:
    def __iter__(self):
        return self
 
    def __next__(self):
        raise StopIteration
Только в next() нужно разумный код написать (сейчас всегда пустую последовательность возвращает).
Как допустимо передать данные в метод итер?
Вроде, никак. Этот метод должен вернуть итератор. А в итераторе должен быть метод next(), который будет возвращать элементы последовательности. Обычно в качестве итератора используют себя.


Реализовал таким образом. Теперь к тому с чего начал. Как быть с синтаксической ошибкой?


Lodhel,
    def __init__(self, iterable, *funcs, judge=judge_any):
        self.iterable = iterable
        self.funcs = funcs
        self.judge = judge
 
    def __iter__(self):
        def f1(x):
            pos, neg = 0, 0
            for f in self.funcs:
                if f(x):
                    pos += 1
                else:
                    neg += 1
            return self.judge(pos, neg)
        return filter(f1, self.iterable)


Полный код:
class multifilter:
    def judge_half(pos, neg):
        return (pos >= neg)
 
    def judge_any(pos, neg):
        return (pos >= 1)
 
    def judge_all(pos, neg):
        return (neg == 0)
 
    def __init__(self, iterable, *funcs, judge=judge_any):
        self.iterable = iterable
        self.funcs = funcs
        self.judge = judge
 
    def __iter__(self):
        def f1(x):
            pos, neg = 0, 0
            for f in self.funcs:
                if f(x):
                    pos += 1
                else:
                    neg += 1
            return self.judge(pos, neg)
        return filter(f1, self.iterable)
 
 
def mul2(x):
    return x % 2 == 0
 
def mul3(x):
    return x % 3 == 0
 
def mul5(x):
    return x % 5 == 0
 
 
a = [i for i in range(31)] # [0, 1, 2, ... , 30]
 
print(list(multifilter(a, mul2, mul3, mul5))) 
# [0, 2, 3, 4, 5, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 26, 27, 28, 30]
 
print(list(multifilter(a, mul2, mul3, mul5, judge=multifilter.judge_half))) 
# [0, 6, 10, 12, 15, 18, 20, 24, 30]
 
print(list(multifilter(a, mul2, mul3, mul5, judge=multifilter.judge_all))) 
# [0, 30]


Ошибку все равно выдает


Lodhel, скин пришли, не может быть