添加int还会创建一个浮点数吗?

时间:2015-10-13 13:17:35

标签: python python-3.4

# Simple Bmi Calculator
# Weight (KG) / Height (M) then Answer / Height (m) = BMI


print("Hello, today we will calculate your Body Mass Index")

weight = input("How many kilo's do you weigh? ")  
weight = int  
height = input("What is your height in metres? ")  
height = int 
bmi = (weight / height / height)  
bmi = int

print("Thank you, your Body Mass Index is ")  
print(bmi)

input("\n\nPress the enter key to exit")

在上面,很可能以米为单位输入高度(即1.8),因此声明了' bmi = int'和' height = int'如果有必要,结束bmi是否仍会产生一个浮点数?

2 个答案:

答案 0 :(得分:2)

是。如果您向int添加浮点数,那么{<1}} 提升之前添加。

答案 1 :(得分:1)

在Python中,当你使用float和一个返回浮点数的int执行操作时,Python会自动处理返回浮点数。

例如:

>>> my_int = 10000
>>> my_float = 10000.10000
>>> dis.dis('my_int + my_float')
  1           0 LOAD_NAME                0 (my_int)
              3 LOAD_NAME                1 (my_float)
              6 BINARY_ADD
              7 RETURN_VALUE

在这里,我们可以看到添加intfloat的字节码说明。

BINARY_ADD操作是我们有兴趣深入研究的。

source of Python 3.4我们可以看到以下操作:

    TARGET(BINARY_ADD) {
        PyObject *right = POP();
        PyObject *left = TOP();
        PyObject *sum;
        if (PyUnicode_CheckExact(left) &&
                 PyUnicode_CheckExact(right)) {
            sum = unicode_concatenate(left, right, f, next_instr);
            /* unicode_concatenate consumed the ref to v */
        }
        else {
            sum = PyNumber_Add(left, right);
            Py_DECREF(left);
        }
        Py_DECREF(right);
        SET_TOP(sum);
        if (sum == NULL)
            goto error;
        DISPATCH();
    }

关注PyNumber_Add

PyObject *
PyNumber_Add(PyObject *v, PyObject *w)
{
    PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
    if (result == Py_NotImplemented) {
        PySequenceMethods *m = v->ob_type->tp_as_sequence;
        Py_DECREF(result);
        if (m && m->sq_concat) {
            return (*m->sq_concat)(v, w);
        }
        result = binop_type_error(v, w, "+");
    }
    return result;
}

binary_op1

...
    if (v->ob_type->tp_as_number != NULL)
        slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
...

此时,我们可以继续追踪传递给NB_BINOP的参数或跳转到documentation of the C-API

从这里开始,我们有充分的理由相信这就是我们正在寻找的东西:

  

PySequence_Concat()使用此函数并具有相同的功能   签名。尝试数字后,+运算符也会使用它   另外通过nb_add插槽。

然后我们可以跳回来查找nb_add来电,最后是float_as_number变量。在此之后float_add将引导我们进行以下操作:

static PyObject *
float_add(PyObject *v, PyObject *w)
{
    double a,b;
    CONVERT_TO_DOUBLE(v, a);
    CONVERT_TO_DOUBLE(w, b);
    PyFPE_START_PROTECT("add", return 0)
    a = a + b;
    PyFPE_END_PROTECT(a)
    return PyFloat_FromDouble(a);
}

我们可以看到传递的参数传递给CONVERT_TO_DOUBLE函数。从这里,我们可以看到conversion if the value wasn't a float

#define CONVERT_TO_DOUBLE(obj, dbl)                     \
    if (PyFloat_Check(obj))                             \
        dbl = PyFloat_AS_DOUBLE(obj);                   \
    else if (convert_to_double(&(obj), &(dbl)) < 0)     \
        return obj;