2008-12-09 102 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