返回
Python内置函数的奥秘:一探究竟,揭秘编程语言的幕后机制
后端
2024-01-08 10:33:08
一、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函数的功能是计算一个对象