1

I wanted to create simple code to test if number is odd or even. I am using Python 2.7.3.

def oddoreven(a):
    try: int(a)
    except: return "Error"
    if a%2==0: return 1
    else: return 0

Instead the code fails with error: TypeError: not all arguments converted during string formatting. The error points to the line beginning with if a%2==0....

While researching this problem I found examples indicating that code like this should work. For example answers to this question offer similar code as solution: python - checking odd/even numbers and changing outputs on number size

So what is wrong with my code?

Community
  • 1
  • 1
Madoc Comadrin
  • 498
  • 1
  • 12
  • 27

3 Answers3

3

the int function doesn't change the a in-place, you need to assign it to a :

>>> def oddoreven(a):
...     try: a=int(a)
...     except: return "Error"
...     if a%2==0: return 1
...     else: return 0 
... 
>>> oddoreven('2')
1
>>> oddoreven('5')
0
>>> oddoreven('a')
'Error'
Mazdak
  • 105,000
  • 18
  • 159
  • 188
3

It's because you first test if a can be converted to an int (which is fine), but then you ignore this test and keep going with the string you provided in argument.

Python is a dynamically typed language, but also strongly typed, which means you can change the type of a variable after it's been declared, but this change has to be explicit (more about this here).

In your case, it means you can't do if a % 2 == 0 if a is a string.

You could do this for instance:

def oddoreven(a):
    try:
        my_int = int(a)
    except TypeError:
        return "The argument provided could not be converted into an int"
    if my_int % 2 == 0:
        return 1
    else:
        return 0
Jivan
  • 21,522
  • 15
  • 80
  • 131
1

As user2357112 stated. (int)a does not convert a to a int. so when you check its modulus you still must convert it.

def oddoreven(a):
    try: int(a)
    except: return "Error"
    if int(a)%2==0: return 1
    else: return 0

print oddoreven(32)

works fine.

As a side note, catching any exception is generally frowned upon. You may want to narrow it down like:

def oddoreven(a):
    try: int(a)
    except TypeError: return "Error"
    if int(a)%2==0: return 1
    else: return 0

print oddoreven(32)
marsh
  • 2,592
  • 5
  • 29
  • 53