Script не будет запущен в Python3.0

Этот script будет работать как ожидалось и пропустить доктрины без каких-либо ошибок в Python 2.6:

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 script "2to3", но никаких изменений не требуется. Кто-нибудь знает, почему script не будет работать в Python 3?

3 ответа

Я предполагаю, что вам нужно n //= 10 вместо n /= 10. Другими словами, вы хотите явно указать целочисленное деление. В противном случае 1 / 10 вернет 0.1 вместо 0. Обратите внимание, что //= является допустимым синтаксисом python 2.x(ну, начиная с версии ~ 2.3, я думаю...).


И теперь для чего-то совершенно другого:

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


Я думаю, это может быть связано с тем, что оператор "/=" в Python 2.x возвращает целочисленный результат, а в Python 3.x он возвращает float. Попробуйте изменить "/=" на "//=". "//=" возвращает целочисленный результат в Python 3.x так же, как "/=" в Python 2.x.

licensed under cc by-sa 3.0 with attribution.