Python Modulo TypeError

时间:2015-04-06 18:56:11

标签: python python-2.7

我想创建简单的代码来测试数字是奇数还是偶数。 我正在使用Python 2.7.3

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

相反,代码失败并显示错误:TypeError: not all arguments converted during string formatting.错误指向以if a%2==0...开头的行。

在研究这个问题时,我发现了一些例子,表明这样的代码应该可行。例如,此问题的答案提供与解决方案类似的代码:python - checking odd/even numbers and changing outputs on number size

我的代码出了什么问题?

3 个答案:

答案 0 :(得分:3)

int函数无法就地更改a,您需要将其分配给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'

答案 1 :(得分:3)

这是因为您首先测试a是否可以转换为int(这很好),但是您忽略了此测试并继续使用您在参数中提供的string

Python是动态类型语言,但强类型,这意味着您可以在声明变量后更改变量的类型,但此更改必须是显式(more about this here)。

在您的情况下,如果if a % 2 == 0是字符串,则表示您无法a

你可以这样做:

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

答案 2 :(得分:1)

正如user2357112所述。 (int)a不将a转换为int。所以当你检查它的模数时,你仍然必须转换它。

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

print oddoreven(32)

工作正常。

作为旁注,通常不赞成任何例外。您可能希望缩小范围,如:

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

print oddoreven(32)