Как выполнить итерацию по кортежу<Список> в Python

#python

#python

Вопрос:

 class App:
    def filter(*input):
        result = []
        print(type(input))
        for arrayOfColors in input:
            print(type(arrayOfColors))
            goodColors = getGoodColors(arrayOfColors)
            result.add(goodColors)
        return result

def getGoodColors(arrayOfColors):
    setOfNotGoodColors = ["gray", "yellow", "purple"]
    goodColors = []
    for color in arrayOfColors:
        if color not in setOfNotGoodColors:
            goodColors.add(color)
    return goodColors
        
app = App()
app.filter(["blue", "red"], ["gray","blue"])
 

Результатом компиляции является:

 <class '__main__.App'>
Traceback (most recent call last):
  File "<string>", line 20, in <module>
File "<string>", line 7, in filter
  File "<string>", line 14, in getGoodColors
TypeError: 'App' object is not iterable
 

Как избавиться от этой ошибки?
Я должен написать больше символов, не являющихся кодом, пожалуйста, помогите.

Комментарии:

1. Я не понимаю, чего вы пытаетесь достичь. Пожалуйста, укажите ввод и ожидаемый результат.

2. input это имя встроенной функции python. Не используйте его как имя переменной.

3. Добро пожаловать в Stack Overflow! Пожалуйста, прочитайте о том, как отлаживать небольшие программы . Вы также можете использовать Python-Tutor , который помогает визуализировать пошаговое выполнение кода.

4. Использование def filter(self, *input): обратите внимание на отсутствие self . Но здесь больше не так.

5. также list.append нет list.add()

Ответ №1:

Внутри класса python каждый метод должен иметь self параметр, например:

 class App:
    def filter(self, *input):
 

с помощью параметра self вы можете получить доступ к свойствам этого экземпляра.

еще одна проблема: чтобы добавить значение в список python, вам нужно использовать функцию append , например:

 goodColors.append(color)
 

Ваш окончательный код должен выглядеть примерно так:

 class App:
    def filter(self, *input):
        result = []
        print(type(input))
        for arrayOfColors in input:
            print(type(arrayOfColors))
            goodColors = getGoodColors(arrayOfColors)
            result.append(goodColors)
        return result

def getGoodColors(arrayOfColors):
    setOfNotGoodColors = ["gray", "yellow", "purple"]
    goodColors = []
    for color in arrayOfColors:
        if color not in setOfNotGoodColors:
            goodColors.append(color)
    return goodColors
        
app = App()
app.filter(["blue", "red"], ["gray","blue"])
 

Примечание: вы не должны использовать ввод имени в качестве параметра, потому что это имя встроенной функции, но код выполняется, даже если вы его используете, поэтому я не исправил это.

Ответ №2:

Вы можете увидеть проблему, если добавите print(input) прямо под def filter(*input): ; вы увидите

 (<__main__.App object at 0x00000211E39C0A48>, ['blue', 'red'], ['gray', 'blue'])
 

Это результат self в каждом классе. Вы можете избежать этого в своем for цикле с помощью фрагмента [1:] . Кроме того, у python list s нет вызываемого атрибута add ; они вызываются append :

 class App:
    def filter(*input):
        result = []
        for arrayOfColors in input[1:]:
            goodColors = getGoodColors(arrayOfColors)
            result.append(goodColors)
        return result

def getGoodColors(arrayOfColors):
    setOfNotGoodColors = ["gray", "yellow", "purple"]
    goodColors = []
    for color in arrayOfColors:
        if color not in setOfNotGoodColors:
            goodColors.append(color)
    return goodColors
        
app = App()
app.filter(["blue", "red"], ["gray","blue"])
 

Обратите внимание, что плохой практикой является присвоение имен вашим переменным, которые принимаются встроенными, поэтому эту input переменную лучше называть как my_input .