简体   繁体   中英

writing odd number in a list python

This is a part of my homework assignment and im close to the final answer but not quite yet. I need to write a function that writes the odd number between position 1 and 5 in a list. I make something like that: -in a file domain I write the condition for odd number:

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

-then the tests:

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])

-and in the other file named userinterface I write this:

 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!") 

-when I run the entire project(I have more requirements but the others one are good), and write odd from [pos] to [pos] it says me

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

I've forgotten to say that I have a also a function main() where I print the requirements.Where am I wrong?

Python's string startswith method, described here:
https://docs.python.org/2/library/stdtypes.html
states that arguments are

some_string.startswith(prefix, beginning, end) #where beginning and end are optional integers

and You have provided prefix and empty string ( cmd.startswith("odd from ", "") )

Some things I noticed:

1) you can shorten your oddNumber function to

def oddNumber(x):
    return x%2

2) in your tests, you rebind the functions name testOdd_Number to some list, then pass that around to your oddNumber function. is that the same function described above? Then it won't work, as this function expects a single integer to be passed.

Using the same name to refer to two different things is discouraged. Actually, I have no idea what your testcode does or should do. Are you passing a list and expect oddNumber to modify it in place?

3) your custom command parser looks... odd, and fragile. Maybe invest in a real parser? You should decouple command parsing and actual computation.

As brainovergrow pointed out, there is also your error, since .startswith does not accept a string as second argument.

Some general hints:

  • You can use list(range(9)) instead of hardcoding [0,1,2,3,4,5,6,7,8]
  • You can use filter to filter the odd numbers of a given list: >>> list(filter(oddNumber, range(9))) yields [1, 3, 5, 7] .
  • You can also use list comprehensions : [x for x in range(9) if x%2] yields the same.
  • you might find any() and all() useful. Take a look at them.
  • Your naming scheme is neighter consistent nor pythonic. Read PEP8 for a style guide.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM