2010-08-22 50 views
4

運行該腳本將運行正如預期的及在Python 2.6通過文檔測試沒有任何錯誤:腳本不會在Python3.0

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中運行?

+1

如何: 高清num_even_digits(N): 回報LEN(過濾器(拉姆達X:(INT(X)%2)== 0,STR (n))) 作爲一個更好的實現? – MarkR 2010-08-22 21:56:39

+3

夥計,空間有什麼問題?你幾乎可以利用每一個機會擺脫他們的腳本。 – 2010-08-22 22:46:37

回答

13

我猜你需要n //= 10而不是n /= 10。換句話說,你想明確指定整數除法。否則1/10將返回0.1而不是0。請注意,//=也是有效的Python 2.x語法,以及(從版本〜2.3開始,我認爲...)。

+2

爲了在2.x中使用'// ='語法(並且替換'/ ='default),必須包含'from __future__ import division'。 – Andrew 2010-08-22 21:32:42

+5

@Andrew - 'from __future__ import division'只改變了默認的'/'運算符,'//'運算符已經存在了很長時間,並且不需要'from __future__ import division'位。即使在Python 2.2(這是我目前使用的最老的解釋器)之前,它仍然是'10 // 2' - >'5'。 – 2010-08-22 21:35:10

+2

@Andrew,半右半錯:沒有導入,默認保持不變(整數截斷之間的'/',如'//'),但是'// ='仍然可以很好地與_or_一起工作,沒有進口。 – 2010-08-22 21:36:55

3

我認爲這可能是因爲Python 2.x中的運算符「/ =」返回整數結果,而在Python 3.x中返回浮點數。嘗試將「/ =」更改爲「// =」。 「// =」返回整數在Python 3.x中的結果與Python 2.x中的「/ =」相同。

5

現在完全不同的東西:

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