#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
.