我试图在Windows10上用Python 3.6.5编写一个程序,它可以接受整数,然后打印出奇数。
这是我的代码:
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()
谁能告诉我为什么会发生这个错误,正确的代码应该是什么?
发布于 2018-06-10 07:38:52
问题出在filterOddInList
内部的递归中。您正在使用item
调用它,这是一个数字。当您到达len(a)
时,它试图提取数字的长度,但失败了。
发布于 2018-06-10 08:05:31
您可能希望将其简化一点。您可以使用列表理解将两个函数合并为一行。我已经重写了你下面的一些代码。
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
是奇数,则将其放入新列表中。”
换句话说,(新列表中的东西) for (旧列表中的项) if (include子句)中的(项)
发布于 2018-06-10 08:10:19
你的代码有几个问题:
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
https://stackoverflow.com/questions/50779389
复制相似问题