脚本不能在Python3.0中运行

时间:2010-08-22 21:21:20

标签: python python-3.x

此脚本将按预期运行,并在Python 2.6中无任何错误地传递doctests:

def num_even_digits(n):
    """
      >>> num_even_digits(123456)
      3
      >>> num_even_digits(2468)
      4
      >>> num_even_digits(1357)
      0
      >>> num_even_digits(2)
      1
      >>> num_even_digits(20)
      2
    """


    count = 0
    while n:
        digit=n%10
        if digit%2==0:
            count+=1
            n/=10
        else:
            n/=10

    return count



if __name__ == '__main__':
    import doctest
    doctest.testmod()

在Python3.0中,这是输出:

**********************************************************************
File "/home/calder/My Documents/Programming/Python Scripts/ch06.py", line 3, in                            
 __main__.num_even_digits`
Failed example:
    num_even_digits(123456)
Expected:
    3
Got:
    1
**********************************************************************
File "/home/calder/My Documents/Programming/Python Scripts/ch06.py", line 5, in                   
__main__.num_even_digits
Failed example:
    num_even_digits(2468)
Expected:
    4
Got:
    1
**********************************************************************
1 items had failures:
   2 of   5 in __main__.num_even_digits
***Test Failed*** 2 failures.

我已经尝试运行Python脚本“2to3”,但它说不需要进行任何更改。有谁知道为什么脚本不能在Python 3中运行?

3 个答案:

答案 0 :(得分:13)

我猜你需要n //= 10而不是n /= 10。换句话说,您希望明确指定整数除法。否则1 / 10将返回0.1而不是0。请注意,//=也是有效的python 2.x语法(好吧,从版本~2.3开始,我认为......)。

答案 1 :(得分:5)

现在有一些完全不同的东西:

count = 0
while n:
   n, digit = divmod(n, 10)
   count += ~digit & 1

答案 2 :(得分:3)

我认为这可能是因为Python 2.x中的运算符“/ =”返回整数结果,而在Python 3.x中它返回float。尝试将“/ =”更改为“// =”。 “// =”以与Python 2.x中“/ =”相同的方式在Python 3.x中返回整数结果。