Madoc Comadrin
Madoc Comadrin

Reputation: 568

Python Modulo TypeError

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?

Upvotes: 1

Views: 392

Answers (3)

Jivan
Jivan

Reputation: 23068

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

Upvotes: 3

Kasravnd
Kasravnd

Reputation: 107297

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'

Upvotes: 3

marsh
marsh

Reputation: 2730

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)

Upvotes: 1

Related Questions