在Python中写入奇数到列表
这是我作业的一部分,我快要找到最终答案了,但还差一点。我需要写一个函数,能够在一个列表中找出位置1到5之间的奇数。
我做了以下几件事:
- 在一个文件中,我写了判断奇数的条件:
def oddNumber(x):
"""
this instruction help us to write the odd numbers from the positions specificated
input: x-number
output:-True if the number is odd
-False otherwise
"""
if x % 2==1:
return True
else:
return False
- 然后我进行了测试:
def testOdd_Number():
testOdd_Number=[0,1,2,3,4,5,6,7,8]
oddNumber(testOdd_Number,0,6)
assert (testOdd_Number==[1,3,5])
oddNumber(testOdd_Number,0,3)
assert (testOdd_Number==[3])
- 在另一个名为userinterface的文件中,我写了这些内容:
elif(cmd.startswith("odd from ", "")):
try:
cmd=cmd.replace("odd from ", "")
cmd=cmd.replace("to ", "")
i=int(cmd[:cmd.find(" ")])
j=int(cmd[cmd.find(" "):])
if (i>=len(NumberList) or i>j or j>=len(NumberList) or i<0 or j<0):
print("Invalid value(s).")
else:
for m in range(i-1,j):
if oddNumber(NumberList[m]):
print (NumberList[m])
except:
print("Error!")
- 当我运行整个项目时(我还有其他要求,但那些都没问题),并从[pos]到[pos]写出奇数时,它告诉我:
Traceback (most recent call last):
File "C:\Users\Adina\My Documents\LiClipse Workspace\P1\userinterface.py", line 94, in <module>
run()
File "C:\Users\Adina\My Documents\LiClipse Workspace\P1\userinterface.py", line 77, in run
elif(cmd.startswith("odd from ", "")):
TypeError: slice indices must be integers or None or have an __index__ method
我忘了说,我还有一个main()函数,用来打印要求。我哪里出错了?
2 个回答
0
我注意到的一些事情:
1) 你的 oddNumber
函数可以简化成下面这样:
def oddNumber(x):
return x%2
2) 在你的测试中,你把函数名 testOdd_Number
重新绑定到一个列表上,然后把这个列表传给你的 oddNumber
函数。这是上面提到的同一个函数吗?如果是的话,它就不行,因为这个函数期望接收一个单独的整数。
用同一个名字指代两个不同的东西是不推荐的。其实,我对你的测试代码是干什么的或者应该干什么完全不清楚。你是在传一个列表,并希望 oddNumber
在原地修改它吗?
3) 你的自定义命令解析器看起来有点奇怪,而且不太稳定。也许可以考虑使用一个真正的解析器?你应该把命令解析和实际计算分开。
正如 brainovergrow 指出的那样,你的代码中也有错误,因为 .startswith
不接受字符串作为第二个参数。
一些一般性的提示:
- 你可以用
list(range(9))
来代替硬编码的[0,1,2,3,4,5,6,7,8]
- 你可以使用
filter
来筛选给定列表中的奇数:>>> list(filter(oddNumber, range(9)))
会得到[1, 3, 5, 7]
。 - 你也可以使用
列表推导式
:[x for x in range(9) if x%2]
结果是一样的。 - 你可能会发现
any()
和all()
很有用,去看看它们吧。 - 你的命名方式既不一致也不符合 Python 的风格。可以看看 PEP8 的风格指南。
3
Python中的字符串方法startswith,详细说明可以在这里找到:
https://docs.python.org/2/library/stdtypes.html
这个方法的参数是
some_string.startswith(prefix, beginning, end) #where beginning and end are optional integers
你提供了前缀和一个空字符串( cmd.startswith("odd from ", "") )