2008-12-09 89 views

回答

24

蛇皮语法定义(来自其使用pgen产生解析器)中,查找 '功率':Gramar/Gramar

蛇皮AST,寻找 'ast_for_power':Python/ast.c

蛇皮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) 
     } 
    } 
} 

它使用它描述了任意精度的有效幂算法的Handbook of Applied CryptographyChapter 14.6讨论算法算术。

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具有自己的实现,是Objects/intobject.c中定义的函数int_pow(PyIntObject * v,PyIntObject * w,PyIntObject * z)longobject .c for 3.0)的Python源代码。

1

我认为caseysrandomthoughts在功能定义问星号。

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

当表单的最终形式参数**的名字,它接收包含除了那些对应于形参的所有参数的字典。

我已经在python doc的其他地方播种了这个东西的描述,但是我不记得了。

+0

当提到函数调用/定义时,**是调用/定义语法的一部分,不是运算符(http://docs.python.org/3.0/reference/expressions.html#id7,http:// docs.python.org/3.0/reference/compound_stmts.html#function-definitions) – 2008-12-10 12:32:05