Что значит «объект типа int не имеет длины» в python? - PullRequest
0 голосов
/ 10 июня 2018

Я пытался написать программу на Python 3.6.5 для Windows 10, которая будет принимать целые числа, а затем распечатывать нечетные.

Это мой код:

def listInput():
    aList = list()
    while True:
        num = input("Please input a number:")
        if num == 'done':
            break
        num = int(num)
        aList.append(num)
    return aList

def isOddNumber(y):
    if y%2 == 0:
        return False
    else:
        return True

def filterOddInList(a):
    i = len(a)
    while i >= 0:
        item = a[(i-1)]
        odd = filterOddInList(item)
        if odd == False:
            x.pop()

def main():
    a = listInput()
    print(a)
    a = filterOddInList(a)
    print(a)

main()

Вот что должно было случиться:

Please input a number:1
Please input a number:2
Please input a number:3
Please input a number:4
Please input a number:5
Please input a number:done
[1, 2, 3, 4, 5]
[1, 3, 5]

Вот что на самом деле произошло:

Please input a number:1
Please input a number:2
Please input a number:3
Please input a number:4
Please input a number:5
Please input a number:done
[1, 2, 3, 4, 5]
Traceback (most recent call last):
  File "C:\Users\Jerry Cui\Documents\New folder\Homework\oddonly.py", line         30, in <module>
    main()
  File "C:\Users\Jerry Cui\Documents\New folder\Homework\oddonly.py", line 27, in main
    a = filterOddInList(a)
  File "C:\Users\Jerry Cui\Documents\New folder\Homework\oddonly.py", line 20, in filterOddInList
    odd = filterOddInList(item)
  File "C:\Users\Jerry Cui\Documents\New folder\Homework\oddonly.py", line 17, in filterOddInList
    i = len(a)
TypeError: object of type 'int' has no len()

Может кто-нибудь сказать мне, почему произошла эта ошибка, и какой должен быть правильный код?

Ответы [ 3 ]

0 голосов
/ 10 июня 2018

Возможно, вы захотите немного упростить это.Вы можете объединить две ваши функции в одну строку, используя понимание списка.Я переписал часть вашего кода ниже.

def list_input():
    a_list = []
    while True:
        num = input("Please input a number:")
        if num == 'done':
            break
        num = int(num)
        a_list.append(num)
    return a_list

def odds_only(list):
    return [x for x in list if x % 2 == 1]

if __name__ == "__main__":
    list = list_input()
    print(list)
    odds = odds_only(list)
    print(odds)

Понимание списка [x for x in list if x % 2 == 1].Он говорит: «Давайте обработаем каждый элемент в list. Мы будем называть каждый элемент x. Если x нечетно, поместите его в новый список».

Другими словами [(то, чтоидет в новый список) для (элемент в старом списке) в (список), если (включить предложение)]

0 голосов
/ 10 июня 2018

Несколько проблем с вашим кодом:

1) Возможно, вы хотели позвонить odd = isOddNumber(a[i-1])
После того, как вы решите эту проблему, вы столкнетесь со следующей ошибкой: "name 'x' is not defined". Я предполагаю, что выпредназначено для x = a в начале функции
После того, как вы решите эту проблему, вы столкнетесь с проблемами для оператора x.pop().pop() удаляет последний элемент из вашего списка.Так что если x = [1,2,3,4,5], x.pop() приведет к x = [1,2,3,4].Другой x.pop() приведет к x = [1,2,3] и так далее.То, что вы хотите, это x.remove(item).

Чтобы подвести итог, исправьте filterOddInList на:

def filterOddInList(a):
  i = len(a)
  x = a
  while i >= 0:
    item = a[(i-1)]
    odd = isOddNumber(item)
    if odd == False:
        x.remove(item)
    i -= 1
  return x
0 голосов
/ 10 июня 2018

Проблема в рекурсии внутри filterOddInList.Вы звоните по номеру item.Когда вы добираетесь до len(a), он пытается извлечь длину числа и терпит неудачу.

...