# 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是否仍会产生一个浮点数?
答案 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
在这里,我们可以看到添加int
和float
的字节码说明。
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;
}
...
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;