Почему Python неправильно оценивает это выражение?

я экспериментировал с математическими способностями Python, и я наткнулся на интересное поведение. Это связано со следующим выражением:

(4+4)+3/4/5*35-(3*(5+7))-6+434+5+5+5

>>> 415

однако, если вы оцениваете выражение с учетом стандартного порядка операций, ответ должен быть 420.25. Я также дважды проверил с WolframAlpha, который дает ответ 420.25. Почему Python дает другой ответ? Имеет ли это какое-то отношение к тому, как он оценивает такие выражения? Есть есть какая-то Конвенция, что ее следует? Любая информация будет очень признательна, спасибо!

6 ответов


вы хотите использовать деление с плавающей запятой. Изменение его на это работает:

(4+4)+3.0/4/5*35-(3*(5+7))-6+434+5+5+5

некоторые примеры целочисленного деления против деления с плавающей запятой:

Python 2.7.2+ (default, Oct  4 2011, 20:06:09) 
>>> 3/4
0
>>> 3.0/4
0.75
>>> 3.0/4.0
0.75

поплавок, разделенный на целое число, является операцией с плавающей запятой. Python 3 изменил это так, что деление с плавающей запятой по умолчанию:

Python 3.2.2 (default, Sep  5 2011, 21:17:14) 
>>> 3/4
0.75

, потому что в Python 2, / использует целочисленное деление, когда оператор и операнд являются целыми числами.

вы можете либо изменить его на float (как предложили другие ответчики), либо использовать from __future__ import division: http://www.python.org/dev/peps/pep-0238/


В Python 2.х / оператор целочисленного деления. Если вы пишете

(4+4)+3.0/4.0/5.0*35-(3*(5+7))-6+434+5+5+5

Он даст ожидаемый ответ.


Это зависит от версии Python вы используете:

$ python3
Python 3.1.4 (default, Nov 12 2011, 12:16:31) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> (4+4)+3/4/5*35-(3*(5+7))-6+434+5+5+5
420.25

перед Python 3,/ оператор выполнил целочисленное деление вместо с плавающей запятой.


это целочисленное деление. В вашем примере, 3/4 возвращает 0. Однако,3.0/4.0 значение 0.75.

>>> (4+4)+3/4/5*35-(3*(5+7))-6+434+5+5+5
415
>>> (4+4)+3./4/5*35-(3*(5+7))-6+434+5+5+5
420.25

это поведение было изменено в версиях Python 3 и выше. Если вы хотите, чтобы по умолчанию деление с плавающей запятой, вы можете импортировать правило.

>>> from __future__ import division
>>> (4+4)+3/4/5*35-(3*(5+7))-6+434+5+5+5
420.25

важно отметить, что ни python, ни WolframAlpha не дадут вам математически правильный ответ, так как в математике мы делаем умножение перед делением и в python * и / имеют одинаковый приоритет, поэтому будем оценивать слева направо.

3.0/4/5*35 # equal 5.25 in python
3.0/4/5*35 # equal 3.0/4/(5*35) or 0.004285714285714286 in math