返回

Python内置函数的奥秘:一探究竟,揭秘编程语言的幕后机制

后端

一、abs函数:绝对值的奥妙

abs函数的功能是取一个数的绝对值,也就是不管这个数是正数还是负数,都返回其正值。在Python/bitlinmodule.c文件中,abs函数的实现非常简单,只有几行代码:

long
PyNumber_Absolute(PyObject *v)
{
    PyNumberMethods *m = v->ob_type->tp_as_number;
    if (m && m->nb_absolute) {
        return m->nb_absolute(v);
    }
    return PyInt_Type.tp_as_number->nb_absolute(v);
}

从代码中可以看出,abs函数首先检查v对象的类型是否有自定义的绝对值方法,如果有就调用自定义的方法,否则就调用内置的绝对值方法。内置的绝对值方法对于整数类型的数据直接返回其绝对值,对于浮点类型的数据则调用fabs函数来计算绝对值。

二、pow函数:幂运算的利器

pow函数的功能是计算一个数的幂次方,也就是将一个数乘以自身一定次数。在Python/bitlinmodule.c文件中,pow函数的实现同样非常简单:

PyObject *
PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
{
    PyNumberMethods *m;

    if (w == NULL || w == Py_None) {
        Py_INCREF(v);
        return v;
    }
    if (z != NULL) {
        PyErr_SetString(PyExc_TypeError, "pow() 3rd argument not allowed "
                        "unless all arguments are integers");
        return NULL;
    }
    m = v->ob_type->tp_as_number;
    if (m && m->nb_power) {
        return m->nb_power(v, w);
    }
    return Py_NotImplemented;
}

从代码中可以看出,pow函数首先检查v对象的类型是否有自定义的幂次方方法,如果有就调用自定义的方法,否则就调用内置的幂次方方法。内置的幂次方方法对于整数类型的数据直接计算幂次方,对于浮点类型的数据则调用pow函数来计算幂次方。

三、min和max函数:大小比较的便捷之道

min和max函数的功能分别是最小值和最大值的比较。在Python/bitlinmodule.c文件中,这两个函数的实现也非常简单:

PyObject *
min_impl(PyObject *args)
{
    PyObject *result = NULL;
    int i;
    if (args == NULL) {
        return NULL;
    }
    if (!PyArg_UnpackTuple(args, "min", 1, 255, &result)) {
        return NULL;
    }
    for (i = 1; i < PyTuple_GET_SIZE(args); i++) {
        PyObject *v = PyTuple_GET_ITEM(args, i);
        result = min_2(result, v);
        if (result == NULL) {
            return NULL;
        }
    }
    return result;
}

PyObject *
max_impl(PyObject *args)
{
    PyObject *result = NULL;
    int i;
    if (args == NULL) {
        return NULL;
    }
    if (!PyArg_UnpackTuple(args, "max", 1, 255, &result)) {
        return NULL;
    }
    for (i = 1; i < PyTuple_GET_SIZE(args); i++) {
        PyObject *v = PyTuple_GET_ITEM(args, i);
        result = max_2(result, v);
        if (result == NULL) {
            return NULL;
        }
    }
    return result;
}

从代码中可以看出,min和max函数都是通过循环来比较各个参数的大小,最后返回最小值或最大值。对于不同类型的数据,min和max函数会调用不同的比较方法。例如,对于整数类型的数据,min和max函数会调用PyInt_Type.tp_as_number->nb_compare方法来比较大小。

四、len函数:长度计算的利器

len函数的功能是计算一个对象