在Python中写入奇数到列表

1 投票
2 回答
583 浏览
提问于 2025-04-29 17:58

这是我作业的一部分,我快要找到最终答案了,但还差一点。我需要写一个函数,能够在一个列表中找出位置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 ", "") )

撰写回答