2017-01-14 10 views
0

Я использую Python 2.7.12; книга алгоритмов, которые я изучаю, использует Python 3. До сих пор я обнаружил, что могу легко изменить большинство алгоритмов на Python 2, но эта функция с квадратным корнем, использующая Закон Ньютона, все еще ускользает от меня.Невозможно заставить Python 3 работать в Python 2.7.12

Вот код, в своем первоначальном Python 3.

def square_root(n): 
    root = n/2 #initial guess will be 1/2 of n 
    for k in range(20): 
     root = (1/2) * (root + (n/root)) 
    return root 

А вот ошибка, когда я пытаюсь вызвать функцию в Python 2.7.12:

print square_root(9) 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 4, in square_root 
ZeroDivisionError: integer division or modulo by zero 

Я бы как знать, как написать эту функцию для Python 2.7.

ответ

3

В Python 2 деление с / выполняет целочисленное деление, когда оба операнда являются целыми; 1/2 есть 0. В Python 3 / всегда выполняет правильное деление (1/2 == 0.5) и // делает целочисленное деление.

Добавьте from __future__ import divison в начало вашего скрипта, чтобы получить поведение Python 3.

+1

вы бьете меня на 3 секунды :) Может, стоит добавить, что в Python 3 эта операция стала надлежащим разделением и дает поплавок – hansaplast

+0

я заметил, сделано :) – RemcoGerlich

+1

Итак, вам не нужно импортировать деление из __future__, просто используйте n/2.0 и 0.5 вместо (1/2). : D – Dalen

1

Разделение двух целых чисел в Python 2 всегда будет целым числом, в то время как в Python 3 это будет поплавок. Чтобы исправить алгоритм, сила питона использовать поплавок операнды:

def square_root(n): 
    root = n/2.0 #initial guess will be 1/2 of n 
    for k in range(20): 
     root = (1.0/2) * (root + (n/root)) 
    return root 

 Смежные вопросы

  • Нет связанных вопросов^_^