我想知道在哪裏找到源代碼來顯示操作符**是如何在Python中實現的。有人能指引我朝着正確的方向嗎?**如何在Python中實現?
回答
蛇皮語法定義(來自其使用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 Cryptography的Chapter 14.6討論算法算術。
對於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源代碼。
我認爲caseysrandomthoughts在功能定義問星號。
您可以在此Python的文檔頁面找到答案:http://docs.python.org/tutorial/controlflow.html#more-on-defining-functions
當表單的最終形式參數**的名字,它接收包含除了那些對應於形參的所有參數的字典。
我已經在python doc的其他地方播種了這個東西的描述,但是我不記得了。
- 1. 如何在Python中實現Haskell實例?
- 2. 如何在Python中實現「如果」?
- 3. 如何實現在Python
- 4. 如何實現在Python
- 5. 如何在Python中實現字數?
- 6. 你如何在Python中實現ECDF?
- 7. 如何在Python中實現日曆?
- 8. 如何在c中實現Python socket.unwrap()?
- 9. __slots__如何在Python中實現?
- 10. [python]:如何在python3中實現切片?
- 11. 如何在Scala中實現Python的issuperset()
- 12. 如何在python中實現超時?
- 13. 如何在Python/Kivy中實現ScrollView
- 14. 如何在Python中實現集線器
- 15. 如何在Python中實現鏈操作?
- 16. 如何在Python中實現`cat`
- 17. 如何在Python中保存實現類?
- 18. 在Python中如何實現rangeiterator?
- 19. 如何在Python中實現定時器
- 20. 如何在Python中實現線程socket.recv()?
- 21. int()是如何在Python中實現的?
- 22. 如何在javascript中實現python的namedtuple
- 23. 在Python中實現
- 24. 在python中實現R表的實現
- 25. Python如何實現str [:: - 1]?
- 26. Python:如何實現__getattr __()?
- 27. 實現在Python
- 28. 實現在Python
- 29. 如何在Delphi中實現XIRR實現?
- 30. Python中如何實現多重賦值?
當提到函數調用/定義時,**是調用/定義語法的一部分,不是運算符(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