如何在Python中实现**?

时间:2008-12-09 22:07:11

标签: python

我想知道我在哪里找到了如何在Python中实现运算符**的源代码。有人能指出我正确的方向吗?

4 个答案:

答案 0 :(得分:24)

python语法定义(使用pgen从中生成解析器),寻找'power':Gramar/Gramar

python ast,寻找'ast_for_power':Python/ast.c

python eval循环,查找'BINARY_POWER':Python/ceval.c

调用PyNumber_Power(在Objects/abstract.c中实现):

PyObject *
PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
{
    return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
}

基本上,调用 pow 插槽。对于长对象(3.0中唯一的默认整数类型),这是在long_pow函数Objects/longobject.c中实现的,对于int对象(在2.x分支中),它在int_pow函数Object/intobject.c中实现

如果你深入了解long_pow,你可以看到在审查参数并进行一些设置之后,可以在这里看到取幂的核心:

if (Py_SIZE(b) <= FIVEARY_CUTOFF) {
    /* Left-to-right binary exponentiation (HAC Algorithm 14.79) */
    /* http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf    */
    for (i = Py_SIZE(b) - 1; i >= 0; --i) {
        digit bi = b->ob_digit[i];

        for (j = 1 << (PyLong_SHIFT-1); j != 0; j >>= 1) {
            MULT(z, z, z)
            if (bi & j)
                MULT(z, a, z)
        }
    }
}
else {
    /* Left-to-right 5-ary exponentiation (HAC Algorithm 14.82) */
    Py_INCREF(z);   /* still holds 1L */
    table[0] = z;
    for (i = 1; i < 32; ++i)
        MULT(table[i-1], a, table[i])

    for (i = Py_SIZE(b) - 1; i >= 0; --i) {
        const digit bi = b->ob_digit[i];

        for (j = PyLong_SHIFT - 5; j >= 0; j -= 5) {
            const int index = (bi >> j) & 0x1f;
            for (k = 0; k < 5; ++k)
                MULT(z, z, z)
            if (index)
                MULT(z, table[index], z)
        }
    }
}

使用Chapter 14.6Handbook of Applied Cryptography中讨论的算法,该算法描述了用于任意精度算术的有效求幂算法。

答案 1 :(得分:1)

这是运营商的力量

python.org doc - Power operator

编辑:哦,dang,代码,对吧。希望链接仍然有用。从我的部分阅读马虎

答案 2 :(得分:1)

有两个不同的实现,一个用于int(long in 3.0)对象,另一个用于float对象。

float pow是Python源代码的Objects / floatobject.c文件中定义的float_pow(PyObject * v,PyObject * w,PyObject * z)函数。这个函数从C stdlib的math.h

调用pow()

int pow有自己的实现,是Python源代码的Objects / intobject.c(longobject.c for 3.0)中定义的函数int_pow(PyIntObject * v,PyIntObject * w,PyIntObject * z)。 p>

答案 3 :(得分:1)

我认为caseysrandomthoughts在函数定义中询问星号。

您可以在此Python文档页面找到答案:http://docs.python.org/tutorial/controlflow.html#more-on-defining-functions

当存在** name形式的最终形式参数时,它会接收一个包含所有关键字参数的字典,但对应于形式参数的参数除外。

我在python doc的其他地方播下了这些东西的描述,但我不记得了。